diff --git a/Duckling/AmountOfMoney/BG/Corpus.hs b/Duckling/AmountOfMoney/BG/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/BG/Corpus.hs
@@ -0,0 +1,120 @@
+-- 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.BG.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 BG Nothing}, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple BGN 1)
+             [ "1 лв"
+             , "един лев"
+             , "1 Лев"
+             ]
+  , examples (simple BGN 10)
+             [ "10 лв"
+             , "десет лева"
+             , "10лв"
+             ]
+  , examples (simple BGN 15.50)
+             [ "15лв и 50ст"
+             , "петнадесет лева и петдесет стотинки"
+             , "15 Лв и 50 Ст"
+             ]
+  , examples (simple Dollar 1)
+             [ "$1"
+             , "един долар"
+             , "1 долар"
+             ]
+  , examples (simple Dollar 10)
+             [ "$10"
+             , "$ 10"
+             , "10$"
+             , "10 Долара"
+             , "десет долара"
+             ]
+  , examples (simple Cent 10)
+             [ "10 цента"
+             , "десет пенита"
+             , "десет цента"
+             , "10¢"
+             ]
+  , examples (simple Cent 50)
+             [ "50 ст"
+             , "петдесет стотинки"
+             , "50ст"
+             ]
+  , examples (simple Dollar 1e4)
+             [ "$10К"
+             , "10к$"
+             , "$10,000"
+             ]
+  , examples (simple USD 3.14)
+             [ "USD3.14"
+             , "3.14US$"
+             , "US$ 3.14"
+             ]
+  , examples (simple EUR 20)
+             [ "20\x20ac"
+             , "20 евро"
+             , "20 Евро"
+             , "EUR 20"
+             , "EUR 20.0"
+             , "20€"
+             , "20 €ur"
+             ]
+  , examples (simple Pound 10)
+             [ "\x00a3\&10"
+             , "десет паунда"
+             ]
+  , examples (simple Dollar 20.43)
+             [ "$20 и 43ц"
+             , "$20 43"
+             , "20 долара 43ц"
+             , "20 долара 43 цента"
+             , "двадесет долара 43 цента"
+             , "20 долара 43"
+             , "двадесет долара и 43"
+             ]
+  , examples (simple GBP 3.01)
+             [ "GBP3.01"
+             , "GBP 3.01"
+             , "3 GBP 1 пени"
+             ]
+  , examples (between Dollar (10, 20))
+             [ "между 10 и 20 долара"
+             , "от 10 до 20 долара"
+             , "около 10-20 долара"
+             , "между 10 и 20 долара"
+             , "около $10-$20"
+             , "10-20 долара"
+             ]
+  , examples (under EUR 7)
+             [ "под седем евро"
+             , "по-малко от 7 Евро"
+             , "под 7€"
+             ]
+  , examples (above Dollar 1.42)
+             [ "над 1 долар и четиридесет и два цента"
+             , "поне $1.42"
+             , "над 1.42 долара"
+             ]
+  ]
diff --git a/Duckling/AmountOfMoney/BG/Rules.hs b/Duckling/AmountOfMoney/BG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/BG/Rules.hs
@@ -0,0 +1,267 @@
+-- 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.AmountOfMoney.BG.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.Types (NumeralData (..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleBGN :: Rule
+ruleBGN = Rule
+  { name = "лв"
+  , pattern =
+    [ regex "ле?ва?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly BGN
+  }
+
+rulePounds :: Rule
+rulePounds = Rule
+  { name = "£"
+  , pattern =
+    [ regex "паунд(а|и)?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
+  }
+
+ruleDollar :: Rule
+ruleDollar = Rule
+  { name = "$"
+  , pattern =
+    [ regex "долар(а|и)?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
+  }
+
+ruleCent :: Rule
+ruleCent = Rule
+  { name = "cent"
+  , pattern =
+    [ regex "ст(отинк(a|и))?|цента?|пени(та)?|пенса?|ц"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  }
+
+ruleEUR :: Rule
+ruleEUR = Rule
+  { name = "€"
+  , pattern =
+    [ regex "евр(о|а)"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EUR
+  }
+
+ruleIntersectAndXCents :: Rule
+ruleIntersectAndXCents = Rule
+  { name = "intersect (and X cents)"
+  , pattern =
+    [ financeWith TAmountOfMoney.value isJust
+    , regex "и"
+    , financeWith TAmountOfMoney.currency (== Cent)
+    ]
+  , 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 =
+    [ financeWith TAmountOfMoney.value isJust
+    , dimension Numeral
+    ]
+  , 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 =
+    [ financeWith TAmountOfMoney.value isJust
+    , regex "и"
+    , dimension Numeral
+    ]
+  , 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 =
+    [ financeWith TAmountOfMoney.value isJust
+    , financeWith id $ \x -> case TAmountOfMoney.value x of
+        Just v | v > 0 -> TAmountOfMoney.currency x == Cent
+        _              -> False
+    ]
+  , 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 "точно|около|приблизително|близо (до)?|почти"
+    , dimension AmountOfMoney
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "между|от"
+    , dimension Numeral
+    , 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}):
+       _) ->
+        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 "между|от"
+    , 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}):
+       _) | c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ dimension Numeral
+    , 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}):
+       _) ->
+         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}):
+       _) | 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 "под|по-малко от|не повече от"
+    , 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 "над|поне|повече от"
+    , 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 =
+  [ ruleBGN
+  , ruleDollar
+  , ruleCent
+  , ruleEUR
+  , ruleIntersect
+  , ruleIntersectAndNumeral
+  , ruleIntersectAndXCents
+  , ruleIntersectXCents
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePounds
+  , rulePrecision
+  ]
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
@@ -9,10 +9,11 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.EN.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
 import Duckling.Testing.Types
@@ -114,6 +115,9 @@
   , examples (simple SAR 42)
              [ "42 SAR"
              , "42 Saudiriyal"
+             ]
+  , examples (simple BGN 42)
+             [ "42 BGN"
              ]
   , examples (simple MYR 42)
              [ "42 MYR"
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.ES.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ES}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, 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
@@ -28,7 +28,7 @@
 ruleDollar = Rule
   { name = "dollar"
   , pattern =
-    [ regex "d(\x00f3|o)lar(es)?"
+    [ regex "d(ó|o)lar(es)?"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
   }
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.FR.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, 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
@@ -44,7 +44,7 @@
 rulePrecision = Rule
   { name = "precision"
   , pattern =
-    [ regex "exactement|quasi|plus ou moins|environ|autour de|(a|\x00e0) peu pr(e|\x00e8)s"
+    [ regex "exactement|quasi|plus ou moins|environ|autour de|(a|à) peu pr(e|è)s"
     , financeWith TAmountOfMoney.value isJust
     ]
   , prod = \tokens -> case tokens of
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.GA.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, 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
@@ -111,7 +111,7 @@
 ruleInr = Rule
   { name = "INR"
   , pattern =
-    [ regex "r(\x00fa|u)pa(\x00ed|i)"
+    [ regex "r(ú|u)pa(í|i)"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly INR
   }
@@ -137,7 +137,7 @@
   { name = "<amount-of-money> glan"
   , pattern =
     [ financeWith TAmountOfMoney.value isJust
-    , regex "glan|baileach|(go )?d(\x00ed|i)reach"
+    , regex "glan|baileach|(go )?d(í|i)reach"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> Just token
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
@@ -8,18 +8,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.HR.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
 import Duckling.AmountOfMoney.Types
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, 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
@@ -64,7 +64,7 @@
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "cent(i|a)?|penij(i|a)?|c|\x00a2|lp|lip(a|e)"
+    [ regex "cent(i|a)?|penij(i|a)?|c|¢|lp|lip(a|e)"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.ID.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ID}, allExamples)
+corpus = (testContext {locale = makeLocale ID Nothing}, 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
@@ -69,7 +69,7 @@
 ruleJpy = Rule
   { name = "JPY"
   , pattern =
-    [ regex "\x00a5\\."
+    [ regex "¥\\."
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly JPY
   }
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.KO.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, 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
@@ -27,7 +27,7 @@
   { name = "<amount-of-money> about"
   , pattern =
     [ financeWith TAmountOfMoney.value isJust
-    , regex "\xc815\xb3c4|\xcbe4"
+    , regex "정도|쯤"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> Just token
@@ -38,7 +38,7 @@
 ruleAud = Rule
   { name = "AUD"
   , pattern =
-    [ regex "\xd638\xc8fc\xb2ec\xb7ec"
+    [ regex "호주달러"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly AUD
   }
@@ -47,7 +47,7 @@
 ruleKrw = Rule
   { name = "₩"
   , pattern =
-    [ regex "\x20a9|\xc6d0"
+    [ regex "₩|원"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly KRW
   }
@@ -56,7 +56,7 @@
 ruleAboutAmountofmoney = Rule
   { name = "about <amount-of-money>"
   , pattern =
-    [ regex "\xc57d|\xb300\xcda9|\xc5bc\xcd94"
+    [ regex "약|대충|얼추"
     , financeWith TAmountOfMoney.value isJust
     ]
   , prod = \tokens -> case tokens of
@@ -68,7 +68,7 @@
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "cents?|\xc13c(\xd2b8|\xce20)"
+    [ regex "cents?|센(트|츠)"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
@@ -77,7 +77,7 @@
 ruleExactlyAmountofmoney = Rule
   { name = "exactly <amount-of-money>"
   , pattern =
-    [ regex "\xb531|\xc815\xd655\xd788"
+    [ regex "딱|정확히"
     , financeWith TAmountOfMoney.value isJust
     ]
   , prod = \tokens -> case tokens of
@@ -103,7 +103,7 @@
 ruleEuro = Rule
   { name = "€"
   , pattern =
-    [ regex "\x20ac|\xc720\xb85c"
+    [ regex "€|유로"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EUR
   }
@@ -112,7 +112,7 @@
 ruleDollar = Rule
   { name = "$"
   , pattern =
-    [ regex "\xb2ec\xb7ec|\xbd88"
+    [ regex "달러|불"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
   }
@@ -121,7 +121,7 @@
 ruleInr = Rule
   { name = "INR"
   , pattern =
-    [ regex "\xb8e8\xd53c|\xc778\xb3c4\xb8e8\xd53c"
+    [ regex "루피|인도루피"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly INR
   }
@@ -130,7 +130,7 @@
 rulePounds = Rule
   { name = "£"
   , pattern =
-    [ regex "\xd30c\xc6b4\xb4dc|\xc601\xad6d\xd30c\xc6b4\xb4dc"
+    [ regex "파운드|영국파운드"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
   }
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.NB.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = NB}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, 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
@@ -56,7 +56,7 @@
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "cents?|penn(y|ies)|(\x00f8)re"
+    [ regex "cents?|penn(y|ies)|(ø)re"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.PT.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.RO.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, 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
@@ -31,7 +31,7 @@
   { name = "intersect (and number)"
   , pattern =
     [ financeWith TAmountOfMoney.value isJust
-    , regex "(s|\x0219)i"
+    , regex "(s|ș)i"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -71,7 +71,7 @@
 rulePrecisionAmountofmoney = Rule
   { name = "about/exactly <amount-of-money>"
   , pattern =
-    [ regex "exact|cam|aprox(\\.|imativ)?|aproape|(i|\x00ee)n jur (de)?"
+    [ regex "exact|cam|aprox(\\.|imativ)?|aproape|(i|î)n jur (de)?"
     , financeWith TAmountOfMoney.value isJust
     ]
   , prod = \tokens -> case tokens of
@@ -83,7 +83,7 @@
 ruleCent = Rule
   { name = "cent|bani"
   , pattern =
-    [ regex "bani?|cen(t|\x021b)i?|c|\x00a2"
+    [ regex "bani?|cen(t|ț)i?|c|¢"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
@@ -102,7 +102,7 @@
   { name = "intersect (and X cents)"
   , pattern =
     [ financeWith TAmountOfMoney.value isJust
-    , regex "(s|\x0219)i"
+    , regex "(s|ș)i"
     , financeWith TAmountOfMoney.currency (== Cent)
     ]
   , prod = \tokens -> case tokens of
@@ -140,7 +140,7 @@
 ruleOtherPounds = Rule
   { name = "other pounds"
   , pattern =
-    [ regex "lir(a|\x0103) (egiptian|libanez)(a|\x0103)"
+    [ regex "lir(a|ă) (egiptian|libanez)(a|ă)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (_:match:_)):_) -> case Text.toLower match of
diff --git a/Duckling/AmountOfMoney/Rules.hs b/Duckling/AmountOfMoney/Rules.hs
--- a/Duckling/AmountOfMoney/Rules.hs
+++ b/Duckling/AmountOfMoney/Rules.hs
@@ -34,22 +34,23 @@
 currencies = HashMap.fromList
   [ ("aed", AED)
   , ("aud", AUD)
+  , ("bgn", BGN)
   , ("brl", BRL)
-  , ("\x00a2", Cent)
+  , ("¢", Cent)
   , ("c", Cent)
   , ("$", Dollar)
   , ("dollar", Dollar)
   , ("dollars", Dollar)
   , ("egp", EGP)
-  , ("\x20ac", EUR)
+  , ("€", EUR)
   , ("eur", EUR)
   , ("euro", EUR)
   , ("euros", EUR)
   , ("eurs", EUR)
-  , ("\x20acur", EUR)
-  , ("\x20acuro", EUR)
-  , ("\x20acuros", EUR)
-  , ("\x20acurs", EUR)
+  , ("€ur", EUR)
+  , ("€uro", EUR)
+  , ("€uros", EUR)
+  , ("€urs", EUR)
   , ("gbp", GBP)
   , ("hrk", HRK)
   , ("idr", IDR)
@@ -58,7 +59,7 @@
   , ("rs.", INR)
   , ("rupee", INR)
   , ("rupees", INR)
-  , ("\x00a5", JPY)
+  , ("¥", JPY)
   , ("jpy", JPY)
   , ("yen", JPY)
   , ("krw", KRW)
@@ -67,7 +68,7 @@
   , ("myr", MYR)
   , ("rm", MYR)
   , ("nok", NOK)
-  , ("\x00a3", Pound)
+  , ("£", Pound)
   , ("pt", PTS)
   , ("pta", PTS)
   , ("ptas", PTS)
@@ -86,7 +87,7 @@
 ruleCurrencies = Rule
   { name = "currencies"
   , pattern =
-    [ regex "(aed|aud|brl|\x00a2|c|\\$|dollars?|egp|(e|\x20ac)uro?s?|\x20ac|gbp|hrk|idr|inr|\x00a5|jpy|krw|kwd|lbp|myr|rm|nok|\x00a3|pta?s?|qar|rs\\.?|ron|rupees?|sar|sek|sgb|us(d|\\$)|vnd|yen)"
+    [ regex "(aed|aud|bgn|brl|¢|c|\\$|dollars?|egp|(e|€)uro?s?|€|gbp|hrk|idr|inr|¥|jpy|krw|kwd|lbp|myr|rm|nok|£|pta?s?|qar|rs\\.?|ron|rupees?|sar|sek|sgb|us(d|\\$)|vnd|yen)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.SV.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = SV}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, 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
@@ -56,7 +56,7 @@
 ruleCent = Rule
   { name = "cent"
   , pattern =
-    [ regex "cents?|penn(y|ies)|\x00f6re"
+    [ regex "cents?|penn(y|ies)|öre"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
   }
diff --git a/Duckling/AmountOfMoney/Types.hs b/Duckling/AmountOfMoney/Types.hs
--- a/Duckling/AmountOfMoney/Types.hs
+++ b/Duckling/AmountOfMoney/Types.hs
@@ -34,6 +34,7 @@
   -- unambiguous
   | AED
   | AUD
+  | BGN
   | BRL
   | EGP
   | EUR
@@ -64,6 +65,7 @@
   toJSON Unnamed = "unknown"
   toJSON AED     = "AED"
   toJSON AUD     = "AUD"
+  toJSON BGN     = "BGN"
   toJSON BRL     = "BRL"
   toJSON EGP     = "EGP"
   toJSON EUR     = "EUR"
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.VI.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.AmountOfMoney.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = VI}, allExamples)
+corpus = (testContext {locale = makeLocale VI Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
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
@@ -28,7 +28,7 @@
 ruleNg = Rule
   { name = "đồng"
   , pattern =
-    [ regex "\x0111\x1ed3ng?"
+    [ regex "đồng?"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly VND
   }
@@ -37,7 +37,7 @@
 ruleDollar = Rule
   { name = "$"
   , pattern =
-    [ regex "\x0111\x00f4 la|\x0111\x00f4 m\x1ef9|\x0111(\x00f4)?"
+    [ regex "đô la|đô mỹ|đ(ô)?"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
   }
@@ -46,7 +46,7 @@
 ruleVnd = Rule
   { name = "VNĐ"
   , pattern =
-    [ regex "vn(\x0110|\\$)"
+    [ regex "vn(Đ|\\$)"
     ]
   , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly VND
   }
@@ -88,7 +88,7 @@
   { name = "intersect and number"
   , pattern =
     [ financeWith TAmountOfMoney.value isJust
-    , regex "v\x00e0"
+    , regex "và"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -118,7 +118,7 @@
   { name = "intersect (và X xu|xen)"
   , pattern =
     [ financeWith TAmountOfMoney.value isJust
-    , regex "v\x00e0"
+    , regex "và"
     , financeWith TAmountOfMoney.currency (== Cent)
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Api.hs b/Duckling/Api.hs
--- a/Duckling/Api.hs
+++ b/Duckling/Api.hs
@@ -17,18 +17,18 @@
   ) where
 
 import Data.HashMap.Strict (HashMap)
-import qualified Data.HashMap.Strict as HashMap
 import Data.HashSet (HashSet)
-import qualified Data.HashSet as HashSet
 import Data.Text (Text)
-import qualified Data.Text as Text
 import Prelude
 import TextShow
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.HashSet as HashSet
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Dimensions
 import Duckling.Engine
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ranking.Classifiers
 import Duckling.Ranking.Rank
 import Duckling.Resolve
@@ -47,11 +47,11 @@
 -- When `targets` is non-empty, returns only tokens of such dimensions.
 analyze :: Text -> Context -> HashSet (Some Dimension) -> [ResolvedToken]
 analyze input context@Context{..} targets =
-  rank (classifiers lang) targets
+  rank (classifiers locale) targets
   . filter (\(Resolved{node = Node{token = (Token d _)}}) ->
       HashSet.null targets || HashSet.member (This d) targets
     )
-  $ parseAndResolve (rulesFor lang targets) input context
+  $ parseAndResolve (rulesFor locale targets) input context
 
 -- | Converts the resolved token to the API format
 formatToken :: Text -> ResolvedToken -> Entity
diff --git a/Duckling/Core.hs b/Duckling/Core.hs
--- a/Duckling/Core.hs
+++ b/Duckling/Core.hs
@@ -12,16 +12,20 @@
 
 module Duckling.Core
   ( Context(..)
+  , Region(..)
   , Dimension(..)
-  , fromName
   , Entity(..)
   , Lang(..)
+  , Locale
   , Some(..)
+  , fromName
+  , makeLocale
   , toName
 
   -- Duckling API
   , parse
   , supportedDimensions
+  , allLocales
 
   -- Reference time builders
   , currentReftime
@@ -39,7 +43,7 @@
 
 import Duckling.Api
 import Duckling.Dimensions.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Types
 
diff --git a/Duckling/Debug.hs b/Duckling/Debug.hs
--- a/Duckling/Debug.hs
+++ b/Duckling/Debug.hs
@@ -18,17 +18,17 @@
   , ptree
   ) where
 
-import qualified Data.HashSet as HashSet
 import Data.Maybe
 import Data.Text (Text)
+import Prelude
+import qualified Data.HashSet as HashSet
 import qualified Data.Text as Text
 import qualified Data.Text.IO as Text
-import Prelude
 
 import Duckling.Api
 import Duckling.Dimensions.Types
 import Duckling.Engine
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Rules
 import Duckling.Testing.Types
@@ -37,13 +37,13 @@
 -- -----------------------------------------------------------------
 -- API
 
-debug :: Lang -> Text -> [Some Dimension] -> IO [Entity]
-debug l = debugContext testContext {lang = l}
+debug :: Locale -> Text -> [Some Dimension] -> IO [Entity]
+debug locale = debugContext testContext {locale = locale}
 
-allParses :: Lang -> Text -> [Some Dimension] -> IO [Entity]
+allParses :: Locale -> Text -> [Some Dimension] -> IO [Entity]
 allParses l sentence targets = debugTokens sentence $ parses l sentence targets
 
-fullParses :: Lang -> Text -> [Some Dimension] -> IO [Entity]
+fullParses :: Locale -> Text -> [Some Dimension] -> IO [Entity]
 fullParses l sentence targets = debugTokens sentence .
   filter (\(Resolved {range = Range start end}) -> start == 0 && end == n) $
   parses l sentence targets
@@ -56,14 +56,14 @@
 -- -----------------------------------------------------------------
 -- Internals
 
-parses :: Lang -> Text -> [Some Dimension] -> [ResolvedToken]
+parses :: Locale -> Text -> [Some Dimension] -> [ResolvedToken]
 parses l sentence targets = flip filter tokens $
   \(Resolved {node = Node{token = (Token d _)}}) ->
     case targets of
       [] -> True
       _ -> elem (This d) targets
   where
-    tokens = parseAndResolve rules sentence testContext {lang = l}
+    tokens = parseAndResolve rules sentence testContext {locale = l}
     rules = rulesFor l $ HashSet.fromList targets
 
 debugContext :: Context -> Text -> [Some Dimension] -> IO [Entity]
diff --git a/Duckling/Dimensions.hs b/Duckling/Dimensions.hs
--- a/Duckling/Dimensions.hs
+++ b/Duckling/Dimensions.hs
@@ -21,6 +21,7 @@
 import Duckling.Dimensions.Types
 import qualified Duckling.Dimensions.Common as CommonDimensions
 import qualified Duckling.Dimensions.AR as ARDimensions
+import qualified Duckling.Dimensions.BG as BGDimensions
 import qualified Duckling.Dimensions.CS as CSDimensions
 import qualified Duckling.Dimensions.DA as DADimensions
 import qualified Duckling.Dimensions.DE as DEDimensions
@@ -31,9 +32,11 @@
 import qualified Duckling.Dimensions.GA as GADimensions
 import qualified Duckling.Dimensions.HE as HEDimensions
 import qualified Duckling.Dimensions.HR as HRDimensions
+import qualified Duckling.Dimensions.HU as HUDimensions
 import qualified Duckling.Dimensions.ID as IDDimensions
 import qualified Duckling.Dimensions.IT as ITDimensions
 import qualified Duckling.Dimensions.JA as JADimensions
+import qualified Duckling.Dimensions.KA as KADimensions
 import qualified Duckling.Dimensions.KO as KODimensions
 import qualified Duckling.Dimensions.MY as MYDimensions
 import qualified Duckling.Dimensions.NB as NBDimensions
@@ -47,7 +50,7 @@
 import qualified Duckling.Dimensions.UK as UKDimensions
 import qualified Duckling.Dimensions.VI as VIDimensions
 import qualified Duckling.Dimensions.ZH as ZHDimensions
-import Duckling.Lang
+import Duckling.Locale
 
 allDimensions :: Lang -> [Some Dimension]
 allDimensions lang = CommonDimensions.allDimensions ++ langDimensions lang
@@ -78,6 +81,7 @@
 
 langDimensions :: Lang -> [Some Dimension]
 langDimensions AR = ARDimensions.allDimensions
+langDimensions BG = BGDimensions.allDimensions
 langDimensions CS = CSDimensions.allDimensions
 langDimensions DA = DADimensions.allDimensions
 langDimensions DE = DEDimensions.allDimensions
@@ -88,9 +92,11 @@
 langDimensions GA = GADimensions.allDimensions
 langDimensions HE = HEDimensions.allDimensions
 langDimensions HR = HRDimensions.allDimensions
+langDimensions HU = HUDimensions.allDimensions
 langDimensions ID = IDDimensions.allDimensions
 langDimensions IT = ITDimensions.allDimensions
 langDimensions JA = JADimensions.allDimensions
+langDimensions KA = KADimensions.allDimensions
 langDimensions KO = KODimensions.allDimensions
 langDimensions MY = MYDimensions.allDimensions
 langDimensions NB = NBDimensions.allDimensions
diff --git a/Duckling/Dimensions/BG.hs b/Duckling/Dimensions/BG.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/BG.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.BG
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Some Dimension]
+allDimensions =
+  [ This Numeral
+  ]
diff --git a/Duckling/Dimensions/HU.hs b/Duckling/Dimensions/HU.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/HU.hs
@@ -0,0 +1,21 @@
+-- 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.HU
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Some Dimension]
+allDimensions =
+  [ This Duration
+  , This Numeral
+  , This Ordinal
+  , This Time
+  ]
diff --git a/Duckling/Dimensions/KA.hs b/Duckling/Dimensions/KA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/KA.hs
@@ -0,0 +1,17 @@
+-- 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.KA
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Some Dimension]
+allDimensions =
+  [ This Numeral ]
diff --git a/Duckling/Dimensions/NL.hs b/Duckling/Dimensions/NL.hs
--- a/Duckling/Dimensions/NL.hs
+++ b/Duckling/Dimensions/NL.hs
@@ -15,6 +15,7 @@
 allDimensions :: [Some Dimension]
 allDimensions =
   [ This Distance
+  , This Duration
   , This Numeral
   , This Ordinal
   , This Volume
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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Distance.CS.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
 import Data.String
 import Prelude
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = CS}, allExamples)
+corpus = (testContext {locale = makeLocale CS Nothing}, 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
@@ -9,18 +9,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Distance.ES.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ES}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/ES/Rules.hs b/Duckling/Distance/ES/Rules.hs
--- a/Duckling/Distance/ES/Rules.hs
+++ b/Duckling/Distance/ES/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent dist> km"
   , pattern =
     [ dimension Distance
-    , regex "k(il(\x00f3|o))?m?(etro)?s?"
+    , regex "k(il(ó|o))?m?(etro)?s?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -51,7 +51,7 @@
   { name = "<dist> centimeters"
   , pattern =
     [ dimension Distance
-    , regex "(cm|cent(\x00ed|i)m(etros?))"
+    , regex "(cm|cent(í|i)m(etros?))"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
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
@@ -15,12 +15,12 @@
 import Data.String
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/FR/Rules.hs b/Duckling/Distance/FR/Rules.hs
--- a/Duckling/Distance/FR/Rules.hs
+++ b/Duckling/Distance/FR/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent dist> km"
   , pattern =
     [ dimension Distance
-    , regex "k(ilo)?m?((e|\x00e9|\x00e8)tre)?s?"
+    , regex "k(ilo)?m?((e|é|è)tre)?s?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -38,7 +38,7 @@
   { name = "<dist> meters"
   , pattern =
     [ dimension Distance
-    , regex "m((e|\x00e9|\x00e8)tres?)?"
+    , regex "m((e|é|è)tres?)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -51,7 +51,7 @@
   { name = "<dist> centimeters"
   , pattern =
     [ dimension Distance
-    , regex "cm|centim(e|\x00e9|\x00e8)tres?"
+    , regex "cm|centim(e|é|è)tres?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
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
@@ -15,12 +15,12 @@
 import Data.String
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/GA/Rules.hs b/Duckling/Distance/GA/Rules.hs
--- a/Duckling/Distance/GA/Rules.hs
+++ b/Duckling/Distance/GA/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<dist> meters"
   , pattern =
     [ dimension Distance
-    , regex "mh?(e|\x00e9)adai?r"
+    , regex "mh?(e|é)adai?r"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -38,7 +38,7 @@
   { name = "<dist> centimeters"
   , pattern =
     [ dimension Distance
-    , regex "(c\\.?m\\.?|g?ch?eintimh?(e|\x00e9)adai?r)"
+    , regex "(c\\.?m\\.?|g?ch?eintimh?(e|é)adai?r)"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -51,7 +51,7 @@
   { name = "<dist> miles"
   , pattern =
     [ dimension Distance
-    , regex "mh?(\x00ed|i)lt?e"
+    , regex "mh?(í|i)lt?e"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -64,7 +64,7 @@
   { name = "<latent dist> km"
   , pattern =
     [ dimension Distance
-    , regex "(k\\.?(m\\.?)?|g?ch?ilim(e|\x00e9)adai?r)"
+    , regex "(k\\.?(m\\.?)?|g?ch?ilim(e|é)adai?r)"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -90,7 +90,7 @@
   { name = "<latent dist> orlach"
   , pattern =
     [ dimension Distance
-    , regex "(''|([nth]-?)?orl(ach|aigh|a(\x00ed|i)|\\.))"
+    , regex "(''|([nth]-?)?orl(ach|aigh|a(í|i)|\\.))"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
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
@@ -14,12 +14,12 @@
 import Data.String
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, 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
@@ -15,12 +15,12 @@
 import Data.String
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/KO/Rules.hs b/Duckling/Distance/KO/Rules.hs
--- a/Duckling/Distance/KO/Rules.hs
+++ b/Duckling/Distance/KO/Rules.hs
@@ -27,7 +27,7 @@
   { name = "<latent dist> yard"
   , pattern =
     [ dimension Distance
-    , regex "y(ar)?ds?|\xc57c\xb4dc"
+    , regex "y(ar)?ds?|야드"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -40,7 +40,7 @@
   { name = "<dist> centimeters"
   , pattern =
     [ dimension Distance
-    , regex "cm|\xc13c(\xd2f0|\xce58)((\xbbf8|\xba54)\xd130)?"
+    , regex "cm|센(티|치)((미|메)터)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -53,9 +53,9 @@
   { name = "<latent dist> feet and <latent dist> inch "
   , pattern =
     [ dimension Distance
-    , regex "('|f(oo|ee)?ts?)|\xd53c\xd2b8"
+    , regex "('|f(oo|ee)?ts?)|피트"
     , dimension Distance
-    , regex "(''|inch(es)?)|\xc778\xce58"
+    , regex "(''|inch(es)?)|인치"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -68,7 +68,7 @@
   { name = "<dist> meters"
   , pattern =
     [ dimension Distance
-    , regex "m|(\xbbf8|\xba54|\xb9e4)\xd130"
+    , regex "m|(미|메|매)터"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -81,7 +81,7 @@
   { name = "<latent dist> feet"
   , pattern =
     [ dimension Distance
-    , regex "('|f(oo|ee)?ts?)|\xd53c\xd2b8"
+    , regex "('|f(oo|ee)?ts?)|피트"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -94,7 +94,7 @@
   { name = "<latent dist> km"
   , pattern =
     [ dimension Distance
-    , regex "km|(\xd0ac|\xd0a4)\xb85c((\xbbf8|\xba54)\xd130)?"
+    , regex "km|(킬|키)로((미|메)터)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -106,7 +106,7 @@
 ruleHalf = Rule
   { name = "half"
   , pattern =
-    [ regex "\xbc18"
+    [ regex "반"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData {TNumeral.value = v}:_) ->
@@ -119,7 +119,7 @@
   { name = "<dist> miles"
   , pattern =
     [ dimension Distance
-    , regex "miles?|\xb9c8\xc77c(\xc988)?"
+    , regex "miles?|마일(즈)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -132,7 +132,7 @@
   { name = "<latent dist> inch"
   , pattern =
     [ dimension Distance
-    , regex "(''|inch(es)?)|\xc778\xce58"
+    , regex "(''|inch(es)?)|인치"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
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
@@ -15,12 +15,12 @@
 import Data.String
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = NL}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, 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
@@ -15,12 +15,12 @@
 import Data.String
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/PT/Rules.hs b/Duckling/Distance/PT/Rules.hs
--- a/Duckling/Distance/PT/Rules.hs
+++ b/Duckling/Distance/PT/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent dist> km"
   , pattern =
     [ dimension Distance
-    , regex "k(il(\x00f3|o))?m?(etro)?s?"
+    , regex "k(il(ó|o))?m?(etro)?s?"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
@@ -51,7 +51,7 @@
   { name = "<dist> centimeters"
   , pattern =
     [ dimension Distance
-    , regex "(cm|cent(\x00ed|i)m(etros?))"
+    , regex "(cm|cent(í|i)m(etros?))"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
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
@@ -15,12 +15,12 @@
 import Data.String
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/RO/Rules.hs b/Duckling/Distance/RO/Rules.hs
--- a/Duckling/Distance/RO/Rules.hs
+++ b/Duckling/Distance/RO/Rules.hs
@@ -103,7 +103,7 @@
   { name = "<dist> miles"
   , pattern =
     [ dimension Distance
-    , regex "mil(e|a|\x0103)"
+    , regex "mil(e|a|ă)"
     ]
   , prod = \tokens -> case tokens of
       (Token Distance dd:_) ->
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
@@ -15,12 +15,12 @@
 import Prelude
 
 import Duckling.Distance.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = TR}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/DA/Rules.hs b/Duckling/Duration/DA/Rules.hs
--- a/Duckling/Duration/DA/Rules.hs
+++ b/Duckling/Duration/DA/Rules.hs
@@ -30,7 +30,7 @@
 ruleExactlyDuration = Rule
   { name = "exactly <duration>"
   , pattern =
-    [ regex "pr(\x00e6)cis"
+    [ regex "pr(æ)cis"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Duration/DE/Rules.hs b/Duckling/Duration/DE/Rules.hs
--- a/Duckling/Duration/DE/Rules.hs
+++ b/Duckling/Duration/DE/Rules.hs
@@ -104,7 +104,7 @@
 ruleAboutDuration = Rule
   { name = "about <duration>"
   , pattern =
-    [ regex "ungef\x00e4hr|zirka"
+    [ regex "ungefähr|zirka"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
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
@@ -17,16 +17,16 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {lang = FR}, examples)
+negativeCorpus = (testContext {locale = makeLocale FR Nothing}, 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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/GA/Rules.hs b/Duckling/Duration/GA/Rules.hs
--- a/Duckling/Duration/GA/Rules.hs
+++ b/Duckling/Duration/GA/Rules.hs
@@ -26,7 +26,7 @@
 ruleCoics = Rule
   { name = "coicís"
   , pattern =
-    [ regex "coic(\x00ed|i)s(\x00ed|i|e)?"
+    [ regex "coic(í|i)s(í|i|e)?"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Day 14
   }
diff --git a/Duckling/Duration/HE/Rules.hs b/Duckling/Duration/HE/Rules.hs
--- a/Duckling/Duration/HE/Rules.hs
+++ b/Duckling/Duration/HE/Rules.hs
@@ -33,7 +33,7 @@
 ruleQuarterOfAnHour = Rule
   { name = "quarter of an hour"
   , pattern =
-    [ regex "(1/4/s \x05e9\x05e2\x05d4|\x05e8\x05d1\x05e2 \x05e9\x05e2\x05d4)"
+    [ regex "(1/4/s שעה|רבע שעה)"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 15
   }
@@ -42,7 +42,7 @@
 ruleHalfAnHour = Rule
   { name = "half an hour"
   , pattern =
-    [ regex "(1/2/s \x05e9\x05e2\x05d4|\x05d7\x05e6\x05d9 \x05e9\x05e2\x05d4)"
+    [ regex "(1/2/s שעה|חצי שעה)"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
   }
@@ -51,7 +51,7 @@
 ruleThreequartersOfAnHour = Rule
   { name = "three-quarters of an hour"
   , pattern =
-    [ regex "(3/4/s \x05e9\x05e2\x05d4|\x05e9\x05dc\x05d5\x05e9\x05ea \x05e8\x05d1\x05e2\x05d9 \x05e9\x05e2\x05d4)"
+    [ regex "(3/4/s שעה|שלושת רבעי שעה)"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 45
   }
@@ -61,7 +61,7 @@
   { name = "number.number hours"
   , pattern =
     [ regex "(\\d+)\\.(\\d+)"
-    , regex "\x05e9\x05e2\x05d4|\x05e9\x05e2\x05d5\x05ea"
+    , regex "שעה|שעות"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
@@ -77,7 +77,7 @@
   { name = "<integer> and an half hours"
   , pattern =
     [ Predicate isNatural
-    , regex "\x05d5\x05d7\x05e6\x05d9 (\x05e9\x05e2\x05d5\x05ea|\x05e9\x05e2\x05d4)"
+    , regex "וחצי (שעות|שעה)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) ->
@@ -89,7 +89,7 @@
 ruleAboutDuration = Rule
   { name = "about <duration>"
   , pattern =
-    [ regex "(\x05d1\x05e2\x05e8\x05da|\x05e1\x05d1\x05d9\x05d1\x05d5\x05ea|\x05d1\x05e7\x05d9\x05e8\x05d5\x05d1)"
+    [ regex "(בערך|סביבות|בקירוב)"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -101,7 +101,7 @@
 ruleExactlyDuration = Rule
   { name = "exactly <duration>"
   , pattern =
-    [ regex "\x05d1\x05d3\x05d9\x05d5\x05e7"
+    [ regex "בדיוק"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Duration/HR/Rules.hs b/Duckling/Duration/HR/Rules.hs
--- a/Duckling/Duration/HR/Rules.hs
+++ b/Duckling/Duration/HR/Rules.hs
@@ -33,7 +33,7 @@
 ruleExactlyDuration = Rule
   { name = "exactly <duration>"
   , pattern =
-    [ regex "to(c|\x010d)no"
+    [ regex "to(c|č)no"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -59,7 +59,7 @@
   { name = "<integer> more <unit-of-duration>"
   , pattern =
     [ Predicate isNatural
-    , regex "vi(s|\x0161)e|manje"
+    , regex "vi(s|š)e|manje"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -74,7 +74,7 @@
 ruleQuarterOfAnHour = Rule
   { name = "quarter of an hour"
   , pattern =
-    [ regex "((1/4|frtalj|kvarat|(c|\x010d)etvrt)\\s?(h|sata)?)"
+    [ regex "((1/4|frtalj|kvarat|(c|č)etvrt)\\s?(h|sata)?)"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 15
   }
@@ -111,7 +111,7 @@
 ruleThreequartersOfAnHour = Rule
   { name = "three-quarters of an hour"
   , pattern =
-    [ regex "((3/4|tri-?frtalja|tri-?kvarat|tri-?(c|\x010d)etvrt(ine)?)\\s?(h|sata)?)"
+    [ regex "((3/4|tri-?frtalja|tri-?kvarat|tri-?(c|č)etvrt(ine)?)\\s?(h|sata)?)"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 45
   }
diff --git a/Duckling/Duration/HU/Corpus.hs b/Duckling/Duration/HU/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/HU/Corpus.hs
@@ -0,0 +1,74 @@
+-- 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.HU.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 HU Nothing}, allExamples)
+
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (DurationData 1 Second)
+             [ "egy másodperc"
+             , "1 másodperc"
+             ]
+  , examples (DurationData 2 Minute)
+             [ "2 perc"
+             , "kettő perc"
+             ]
+  , examples (DurationData 15 Minute)
+             [ "negyed óra"
+             , "negyedóra"
+             , "negyed-óra"
+             ]
+  , examples (DurationData 30 Minute)
+             [ "fél óra"
+             , "félóra"
+             , "fél-óra"
+             ]
+  , examples (DurationData 45 Minute)
+             [ "háromnegyed óra"
+             , "háromnegyed-óra"
+             , "háromnegyedóra"
+             , "3/4 óra"
+             , "3/4óra"
+             ]
+  , examples (DurationData 150 Minute)
+             [ "2.5 óra"
+             , "kettő és fél óra"
+             , "kettő és fél-óra"
+             , "kettő és félóra"
+             ]
+  , examples (DurationData 30 Day)
+             [ "30 nap"
+             ]
+  , examples (DurationData 7 Week)
+             [ "hét hét"
+             ]
+  , examples (DurationData 1 Month)
+             [ "egy hónap"
+             ]
+  , examples (DurationData 3 Quarter)
+             [ "3 negyedév"
+             ]
+  , examples (DurationData 2 Year)
+             [ "2 év"
+             ]
+  ]
diff --git a/Duckling/Duration/HU/Rules.hs b/Duckling/Duration/HU/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/HU/Rules.hs
@@ -0,0 +1,91 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.HU.Rules
+  ( rules ) where
+
+import Control.Monad (join)
+import Data.String
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers
+import Duckling.Numeral.Helpers (parseInt, parseInteger)
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.TimeGrain.Types as TG
+
+ruleDurationQuarterOfAnHour :: Rule
+ruleDurationQuarterOfAnHour = Rule
+  { name = "quarter of an hour"
+  , pattern =
+    [ regex "(negyed[\\s-]?\x00F3ra)"
+    ]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 15
+  }
+
+ruleDurationHalfAnHour :: Rule
+ruleDurationHalfAnHour = Rule
+  { name = "half an hour"
+  , pattern =
+    [ regex "(f\x00E9l[\\s-]?\x00F3ra)"
+    ]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
+  }
+
+ruleDurationThreeQuartersOfAnHour :: Rule
+ruleDurationThreeQuartersOfAnHour = Rule
+  { name = "three-quarters of an hour"
+  , pattern =
+    [ regex "(3/4[\\s-]?óra|h\x00E1romnegyed[\\s-]?\x00F3ra)"
+    ]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 45
+  }
+
+ruleDurationDotNumeralHours :: Rule
+ruleDurationDotNumeralHours = Rule
+  { name = "number.number hours"
+  , pattern =
+    [ regex "(\\d+)\\.(\\d+) óra"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
+        hh <- parseInteger h
+        mnum <- parseInteger m
+        let mden = 10 ^ Text.length m
+        Just . Token Duration $ minutesFromHourMixedFraction hh mnum mden
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfHour :: Rule
+ruleDurationAndHalfHour = Rule
+  { name = "<integer> and an half hour"
+  , pattern =
+    [ Predicate isNatural
+    , regex "\x00E9s f\x00E9l[\\s-]?\x00F3ra"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral (NumeralData {TNumeral.value = v}):_) ->
+        Just . Token Duration . duration TG.Minute $ 30 + 60 * floor v
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDurationQuarterOfAnHour
+  , ruleDurationHalfAnHour
+  , ruleDurationThreeQuartersOfAnHour
+  , ruleDurationDotNumeralHours
+  , ruleDurationAndHalfHour
+  ]
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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = JA}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, 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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/KO/Rules.hs b/Duckling/Duration/KO/Rules.hs
--- a/Duckling/Duration/KO/Rules.hs
+++ b/Duckling/Duration/KO/Rules.hs
@@ -31,7 +31,7 @@
   { name = "half an hour"
   , pattern =
     [ Predicate $ isGrain TG.Hour
-    , regex "\xbc18"
+    , regex "반"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
   }
@@ -40,7 +40,7 @@
 ruleADay = Rule
   { name = "a day - 하루"
   , pattern =
-    [ regex "\xd558\xb8e8"
+    [ regex "하루"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Day 1
   }
@@ -50,7 +50,7 @@
   { name = "number.number hours"
   , pattern =
     [ regex "(\\d+)\\.(\\d+)"
-    , regex "\xc2dc\xac04"
+    , regex "시간"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
@@ -66,7 +66,7 @@
   { name = "<integer> and an half hours"
   , pattern =
     [ Predicate isNatural
-    , regex "\xc2dc\xac04\xbc18"
+    , regex "시간반"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) ->
@@ -78,7 +78,7 @@
 ruleAboutDuration = Rule
   { name = "about <duration>"
   , pattern =
-    [ regex "\xb300\xcda9|\xc57d"
+    [ regex "대충|약"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -90,7 +90,7 @@
 ruleExactlyDuration = Rule
   { name = "exactly <duration>"
   , pattern =
-    [ regex "\xc815\xd655\xd788"
+    [ regex "정확히"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = NB}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/NL/Corpus.hs b/Duckling/Duration/NL/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/NL/Corpus.hs
@@ -0,0 +1,83 @@
+-- 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.NL.Corpus
+  ( corpus
+  , negativeCorpus
+  ) where
+
+import Prelude
+import Data.String
+
+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 NL Nothing}, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (testContext {locale = makeLocale NL Nothing}, examples)
+  where
+    examples =
+      [ "voor maanden"
+      , "in enkele dagen"
+      , "secretaris"
+      , "last minute"
+      , "12 uurtje"
+      ]
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (DurationData 1 Second)
+             [ "een seconde"
+             , "één seconde"
+             , "1 secondes"
+             , "1 s"
+             , "1\""
+             ]
+  , examples (DurationData 14 Second)
+             [ "veertien seconden"
+             , "14 s"
+             ]
+  , examples (DurationData 2 Minute)
+             [ "2 min"
+             , "twee minuten"
+             , "2 m"
+             , "2'"
+             ]
+  , examples (DurationData 30 Day)
+             [ "30 dagen"
+             ]
+  , examples (DurationData 7 Week)
+             [ "zeven weken"
+             , "7 w"
+             ]
+  , examples (DurationData 1 Month)
+             [ "1 mnd"
+             , "een maand"
+             , "één maand"
+             ]
+  , examples (DurationData 3 Quarter)
+             [ "drie kwartier"
+             ]
+  , examples (DurationData 2 Year)
+             [ "2 jaar"
+             , "2 jaren"
+             , "twee jaren"
+             , "2 j"
+             ]
+   , examples (DurationData 150 Minute)
+              [ "twee en een half uur"
+              , "2,5 uur"
+              ]
+  ]
diff --git a/Duckling/Duration/NL/Rules.hs b/Duckling/Duration/NL/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/NL/Rules.hs
@@ -0,0 +1,114 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.NL.Rules
+  ( rules ) where
+
+import Control.Monad (join)
+import Prelude
+import Data.String
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers
+import Duckling.Numeral.Helpers (parseInt, parseInteger)
+import Duckling.Numeral.Types (NumeralData(..))
+import Duckling.Regex.Types
+import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.TimeGrain.Types as TG
+
+ruleDurationQuarterOfAnHour :: Rule
+ruleDurationQuarterOfAnHour = Rule
+  { name = "quarter of an hour"
+  , pattern = [ regex "1/4\\s?uur"]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 15
+  }
+
+ruleDurationHalfAnHour :: Rule
+ruleDurationHalfAnHour = Rule
+  { name = "half an hour"
+  , pattern = [regex "(1/2\\s?uur|half uur)"]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
+  }
+
+ruleDurationThreeQuartersOfAnHour :: Rule
+ruleDurationThreeQuartersOfAnHour = Rule
+  { name = "three-quarters of an hour"
+  , pattern = [regex "3/4\\s?uur"]
+  , prod = \_ -> Just . Token Duration $ duration TG.Minute 45
+  }
+
+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 TG.Minute $ floor v
+         "\"" -> Just . Token Duration . duration TG.Second $ floor v
+         _    -> Nothing
+      _ -> Nothing
+  }
+
+ruleDurationDotNumeralHours :: Rule
+ruleDurationDotNumeralHours = Rule
+  { name = "number,number uur"
+  , pattern = [regex "(\\d+)\\,(\\d+) *(uur|uren)"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
+        hh <- parseInteger h
+        mnum <- parseInteger m
+        let mden = 10 ^ Text.length m
+        Just . Token Duration $ minutesFromHourMixedFraction hh mnum mden
+      _ -> Nothing
+  }
+
+ruleDurationAndHalfHour :: Rule
+ruleDurationAndHalfHour = Rule
+  { name = "<integer> and an half hour"
+  , pattern =
+    [ Predicate isNatural
+    , regex "en een half (uur|uren)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral (NumeralData {TNumeral.value = v}):_) ->
+        Just . Token Duration . duration TG.Minute $ 30 + 60 * floor v
+      _ -> Nothing
+  }
+
+ruleDurationPrecision :: Rule
+ruleDurationPrecision = Rule
+  { name = "about|exactly <duration>"
+  , pattern =
+    [ regex "(ongeveer|precies|plusminus|exact)"
+    , dimension Duration
+    ]
+    , prod = \tokens -> case tokens of
+        (_:token:_) -> Just token
+        _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDurationQuarterOfAnHour
+  , ruleDurationHalfAnHour
+  , ruleDurationThreeQuartersOfAnHour
+  , ruleDurationDotNumeralHours
+  , ruleDurationAndHalfHour
+  , ruleDurationPrecision
+  , ruleNumeralQuotes
+  ]
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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = PL}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/PL/Rules.hs b/Duckling/Duration/PL/Rules.hs
--- a/Duckling/Duration/PL/Rules.hs
+++ b/Duckling/Duration/PL/Rules.hs
@@ -30,7 +30,7 @@
 ruleHalfAnHour = Rule
   { name = "half an hour"
   , pattern =
-    [ regex "p(o|\x00f3)(l|\x0142) godziny"
+    [ regex "p(o|ó)(l|ł) godziny"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
   }
@@ -72,7 +72,7 @@
   { name = "<integer> and an half hours"
   , pattern =
     [ Predicate isNatural
-    , regex "i (p(o|\x00f3)(l|\x0142)) godziny"
+    , regex "i (p(o|ó)(l|ł)) godziny"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) ->
@@ -96,7 +96,7 @@
 ruleAboutDuration = Rule
   { name = "about <duration>"
   , pattern =
-    [ regex "(oko(l|\x0142)o|miej wi(\x0119|e)cej|jakie(s|\x015b))"
+    [ regex "(oko(l|ł)o|miej wi(ę|e)cej|jakie(s|ś))"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -108,7 +108,7 @@
 ruleExactlyDuration = Rule
   { name = "exactly <duration>"
   , pattern =
-    [ regex "r(o|\x00f3)wno|dok(l|\x0142)adnie"
+    [ regex "r(o|ó)wno|dok(l|ł)adnie"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, 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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/RO/Rules.hs b/Duckling/Duration/RO/Rules.hs
--- a/Duckling/Duration/RO/Rules.hs
+++ b/Duckling/Duration/RO/Rules.hs
@@ -24,7 +24,7 @@
 ruleQuarterOfAnHour = Rule
   { name = "quarter of an hour"
   , pattern =
-    [ regex "(1/4\\s?(h|or(a|\x0103))|sfert de or(a|\x0103))"
+    [ regex "(1/4\\s?(h|or(a|ă))|sfert de or(a|ă))"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 15
   }
@@ -33,7 +33,7 @@
 ruleJumatateDeOra = Rule
   { name = "jumatate de ora"
   , pattern =
-    [ regex "(1/2\\s?(h|or(a|\x0103))|jum(a|\x0103)tate (de )?or(a|\x0103))"
+    [ regex "(1/2\\s?(h|or(a|ă))|jum(a|ă)tate (de )?or(a|ă))"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 30
   }
@@ -42,7 +42,7 @@
 ruleTreiSferturiDeOra = Rule
   { name = "trei sferturi de ora"
   , pattern =
-    [ regex "(3/4\\s?(h|or(a|\x0103))|trei sferturi de or(a|\x0103))"
+    [ regex "(3/4\\s?(h|or(a|ă))|trei sferturi de or(a|ă))"
     ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 45
   }
@@ -63,7 +63,7 @@
 ruleExactInJurDeDuration = Rule
   { name = "exact|in jur de <duration>"
   , pattern =
-    [ regex "(exact|aproximativ|(i|\x00ee)n jur de)"
+    [ regex "(exact|aproximativ|(i|î)n jur de)"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
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
@@ -16,13 +16,13 @@
 import Data.String
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {lang = SV}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, 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
@@ -16,13 +16,13 @@
 import Prelude
 
 import Duckling.Duration.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.TimeGrain.Types (Grain (..))
 
 corpus :: Corpus
-corpus = (testContext {lang = TR}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/TR/Rules.hs b/Duckling/Duration/TR/Rules.hs
--- a/Duckling/Duration/TR/Rules.hs
+++ b/Duckling/Duration/TR/Rules.hs
@@ -30,7 +30,7 @@
 ruleDurationQuarterOfAnHour :: Rule
 ruleDurationQuarterOfAnHour = Rule
   { name = "quarter of an hour"
-  , pattern = [ regex "(1/4\\s?sa(at)?|\x00e7eyrek saat)" ]
+  , pattern = [ regex "(1/4\\s?sa(at)?|çeyrek saat)" ]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 15
   }
 
@@ -44,7 +44,7 @@
 ruleDurationThreeQuartersOfAnHour :: Rule
 ruleDurationThreeQuartersOfAnHour = Rule
   { name = "three-quarters of an hour"
-  , pattern = [regex "(3/4\\s?sa(at)?|\x00fc\x00e7e \231eyrek sa(at)?)"]
+  , pattern = [regex "(3/4\\s?sa(at)?|üçe \231eyrek sa(at)?)"]
   , prod = \_ -> Just . Token Duration $ duration TG.Minute 45
   }
 
@@ -90,7 +90,7 @@
   { name = "<integer> and an half hour"
   , pattern =
     [ Predicate isNatural
-    , regex "bu\x00e7euk sa(at)?"
+    , regex "buçeuk sa(at)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) ->
@@ -103,7 +103,7 @@
 ruleDurationPrecision = Rule
   { name = "<duration> about|exactly"
   , pattern =
-    [ regex "(gibi|civar\305nda|yakla\x015f\305k|tam( olarak)?)"
+    [ regex "(gibi|civar\305nda|yaklaş\305k|tam( olarak)?)"
     , dimension Duration
     ]
     , prod = \tokens -> case tokens of
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
@@ -12,15 +12,17 @@
   ( corpus
   ) where
 
-import Prelude
 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, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, 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
@@ -13,8 +13,8 @@
   , negativeCorpus
   ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.Email.Types
 import Duckling.Testing.Types
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
@@ -10,6 +10,7 @@
 
 module Duckling.Email.EN.Corpus
   ( corpus
+  , negativeCorpus
   ) where
 
 import Data.String
@@ -17,6 +18,15 @@
 
 import Duckling.Email.Types
 import Duckling.Testing.Types
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (testContext, examples)
+  where
+    examples =
+      [ "fitness at 6.40"
+      , "class at 12.00"
+      , "tonight at 9.15"
+      ]
 
 corpus :: Corpus
 corpus = (testContext, allExamples)
diff --git a/Duckling/Email/EN/Rules.hs b/Duckling/Email/EN/Rules.hs
--- a/Duckling/Email/EN/Rules.hs
+++ b/Duckling/Email/EN/Rules.hs
@@ -13,20 +13,20 @@
   ( rules ) where
 
 import Data.String
-import qualified Data.Text as Text
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Email.Types (EmailData (..))
-import qualified Duckling.Email.Types as TEmail
 import Duckling.Regex.Types
 import Duckling.Types
+import qualified Duckling.Email.Types as TEmail
 
 ruleEmailSpelledOut :: Rule
 ruleEmailSpelledOut = Rule
   { name = "email spelled out"
   , pattern =
-    [ regex "([\\w\\._+-]+) at ([\\w_-]+(\\.[\\w_-]+)+)"
+    [ regex "([\\w\\._+-]+) at ([\\w_-]+(\\.[a-zA-Z]+)+)"
     ]
   , prod = \xs -> case xs of
       (Token RegexMatch (GroupMatch (m1:m2:_)):_) ->
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
@@ -16,12 +16,12 @@
 import Prelude
 
 import Duckling.Email.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, 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
@@ -16,12 +16,12 @@
 import Prelude
 
 import Duckling.Email.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = IT}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Engine.hs b/Duckling/Engine.hs
--- a/Duckling/Engine.hs
+++ b/Duckling/Engine.hs
@@ -20,25 +20,25 @@
 import Control.DeepSeq
 import Control.Monad.Extra
 import Data.Aeson
-import qualified Data.Array as Array
 import Data.ByteString (ByteString)
 import Data.Functor.Identity
-import qualified Data.Foldable as Foldable
 import Data.Maybe
 import Data.Text (Text)
-import qualified Data.List as L
 import Prelude
+import qualified Data.Array as Array
+import qualified Data.Foldable as Foldable
+import qualified Data.List as L
 import qualified Text.Regex.PCRE as PCRE
 
 import Duckling.Dimensions.Types
-import qualified Duckling.Engine.Regex as Regex
 import Duckling.Regex.Types
 import Duckling.Resolve
 import Duckling.Types
-import qualified Duckling.Types.Document as Document
 import Duckling.Types.Document (Document)
-import qualified Duckling.Types.Stash as Stash
 import Duckling.Types.Stash (Stash)
+import qualified Duckling.Engine.Regex as Regex
+import qualified Duckling.Types.Document as Document
+import qualified Duckling.Types.Stash as Stash
 
 -- -----------------------------------------------------------------
 -- Engine
diff --git a/Duckling/Lang.hs b/Duckling/Lang.hs
deleted file mode 100644
--- a/Duckling/Lang.hs
+++ /dev/null
@@ -1,55 +0,0 @@
--- 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 NoRebindableSyntax #-}
-
-module Duckling.Lang
-  ( Lang(..)
-  ) where
-
-import Prelude
-
-import Data.Hashable
-import GHC.Generics
-import TextShow (TextShow)
-import qualified TextShow as TS
-
-data Lang
-  = AR
-  | CS
-  | DA
-  | DE
-  | EN
-  | ES
-  | ET
-  | FR
-  | GA
-  | HE
-  | HR
-  | ID
-  | IT
-  | JA
-  | KO
-  | MY
-  | NB
-  | NL
-  | PL
-  | PT
-  | RO
-  | RU
-  | SV
-  | TR
-  | UK
-  | VI
-  | ZH
-  deriving (Bounded, Enum, Eq, Generic, Hashable, Ord, Read, Show)
-
-instance TextShow Lang where
-  showb = TS.fromString . show
diff --git a/Duckling/Locale.hs b/Duckling/Locale.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Locale.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 DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Locale
+  ( Lang(..)
+  , Locale(..)
+  , Region(..)
+  , allLocales
+  , makeLocale
+  ) where
+
+import Data.Hashable
+import Data.HashMap.Strict (HashMap)
+import Data.HashSet (HashSet)
+import GHC.Generics
+import Prelude
+import TextShow (TextShow)
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.HashSet as HashSet
+import qualified TextShow as TS
+
+-- | ISO 639-1 Language.
+-- See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+data Lang
+  = AR
+  | BG
+  | CS
+  | DA
+  | DE
+  | EN
+  | ES
+  | ET
+  | FR
+  | GA
+  | HE
+  | HR
+  | HU
+  | ID
+  | IT
+  | JA
+  | KA
+  | KO
+  | MY
+  | NB
+  | NL
+  | PL
+  | PT
+  | RO
+  | RU
+  | SV
+  | TR
+  | UK
+  | VI
+  | ZH
+  deriving (Bounded, Enum, Eq, Generic, Hashable, Ord, Read, Show)
+
+instance TextShow Lang where
+  showb = TS.fromString . show
+
+-- | ISO 3166-1 alpha-2 Country code (includes regions and territories).
+-- See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
+data Region
+  = CA
+  | CN
+  | GB
+  | HK
+  | MO
+  | TW
+  | US
+  deriving (Bounded, Enum, Eq, Generic, Hashable, Ord, Read, Show)
+
+instance TextShow Region where
+  showb = TS.fromString . show
+
+data Locale = Locale Lang (Maybe Region)
+  deriving (Eq, Generic, Hashable, Ord)
+
+instance Show Locale where
+  show (Locale lang Nothing) = show lang ++ "_XX"
+  show (Locale lang (Just region)) = show lang ++ "_" ++ show region
+
+instance TextShow Locale where
+  showb = TS.fromString . show
+
+makeLocale :: Lang -> Maybe Region -> Locale
+makeLocale lang Nothing = Locale lang Nothing
+makeLocale lang (Just region)
+  | HashSet.member region locales = Locale lang $ Just region
+  | otherwise = Locale lang Nothing
+  where
+    locales = HashMap.lookupDefault HashSet.empty lang allLocales
+
+allLocales :: HashMap Lang (HashSet Region)
+allLocales = HashMap.fromList
+  [ (EN, HashSet.fromList [CA, GB, US])
+  , (ZH, HashSet.fromList [CN, HK, MO, TW])
+  ]
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = AR}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, 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
@@ -28,7 +28,7 @@
 ruleInteger5 = Rule
   { name = "integer 4"
   , pattern =
-    [ regex "(\x0623\x0631\x0628\x0639(\x0629)?)"
+    [ regex "(أربع(ة)?)"
     ]
   , prod = \_ -> integer 4
   }
@@ -38,7 +38,7 @@
   { name = "integer 101..999"
   , pattern =
     [ oneOf [100, 200 .. 900]
-    , regex "\x0648"
+    , regex "و"
     , numberBetween 1 100
     ]
   , prod = \tokens -> case tokens of
@@ -53,7 +53,7 @@
 ruleInteger18 = Rule
   { name = "integer 12"
   , pattern =
-    [ regex "(\x0625\x062b\x0646(\x062a)?\x0649 \x0639\x0634\x0631)"
+    [ regex "(إثن(ت)?ى عشر)"
     ]
   , prod = \_ -> integer 12
   }
@@ -75,18 +75,18 @@
 ruleInteger19 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(\x0639\x0634\x0631\x0648\x0646|\x062b\x0644\x0627\x062b\x0648\x0646|\x0623\x0631\x0628\x0639\x0648\x0646|\x062e\x0645\x0633\x0648\x0646|\x0633\x062a\x0648\x0646|\x0633\x0628\x0639\x0648\x0646|\x062b\x0645\x0627\x0646\x0648\x0646|\x062a\x0633\x0639\x0648\x0646)"
+    [ regex "(عشرون|ثلاثون|أربعون|خمسون|ستون|سبعون|ثمانون|تسعون)"
     ]
   , prod = \tokens -> case tokens of
       Token RegexMatch (GroupMatch (match:_)):_ -> case match of
-        "\x0639\x0634\x0631\x0648\x0646" -> integer 20
-        "\x062b\x0644\x0627\x062b\x0648\x0646" -> integer 30
-        "\x0623\x0631\x0628\x0639\x0648\x0646" -> integer 40
-        "\x062e\x0645\x0633\x0648\x0646" -> integer 50
-        "\x0633\x062a\x0648\x0646" -> integer 60
-        "\x0633\x0628\x0639\x0648\x0646" -> integer 70
-        "\x062b\x0645\x0627\x0646\x0648\x0646" -> integer 80
-        "\x062a\x0633\x0639\x0648\x0646" -> integer 90
+        "عشرون" -> integer 20
+        "ثلاثون" -> integer 30
+        "أربعون" -> integer 40
+        "خمسون" -> integer 50
+        "ستون" -> integer 60
+        "سبعون" -> integer 70
+        "ثمانون" -> integer 80
+        "تسعون" -> integer 90
         _ -> Nothing
       _ -> Nothing
   }
@@ -96,7 +96,7 @@
   { name = "integer 21..99"
   , pattern =
     [ numberBetween 1 10
-    , regex "\x0648"
+    , regex "و"
     , oneOf [20, 30 .. 90]
     ]
   , prod = \tokens -> case tokens of
@@ -147,7 +147,7 @@
 ruleInteger15 = Rule
   { name = "integer 11"
   , pattern =
-    [ regex "(\x0625\x062d\x062f\x0649 \x0639\x0634\x0631(\x0629)?)"
+    [ regex "(إحدى عشر(ة)?)"
     ]
   , prod = \_ -> integer 11
   }
@@ -168,21 +168,21 @@
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(\x0645\x0627\x0626\x0629|\x0645\x0626\x0627\x062a|\x0623\x0644\x0641|\x0627\x0644\x0641|\x0622\x0644\x0627\x0641|\x0645\x0644\x0627\x064a\x064a(\x0646)?)"
+    [ regex "(مائة|مئات|ألف|الف|آلاف|ملايي(ن)?)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "\x0645\x0627\x0626\x0629" ->
+        "مائة" ->
           double 1e2 >>= withGrain 2 >>= withMultipliable
-        "\x0645\x0626\x0627\x062a" ->
+        "مئات" ->
           double 1e2 >>= withGrain 2 >>= withMultipliable
-        "\x0623\x0644\x0641" -> double 1e3 >>= withGrain 3 >>= withMultipliable
-        "\x0627\x0644\x0641" -> double 1e3 >>= withGrain 3 >>= withMultipliable
-        "\x0622\x0644\x0627\x0641" ->
+        "ألف" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "الف" -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "آلاف" ->
           double 1e3 >>= withGrain 3 >>= withMultipliable
-        "\x0645\x0644\x0627\x064a\x064a" ->
+        "ملايي" ->
           double 1e6 >>= withGrain 6 >>= withMultipliable
-        "\x0645\x0644\x0627\x064a\x064a\x0646" ->
+        "ملايين" ->
           double 1e6 >>= withGrain 6 >>= withMultipliable
         _ -> Nothing
       _ -> Nothing
@@ -192,7 +192,7 @@
 ruleInteger3 = Rule
   { name = "integer 2"
   , pattern =
-    [ regex "(\x0627\x062b\x0646\x0627\x0646|\x0627\x062b\x0646\x064a\x0646)"
+    [ regex "(اثنان|اثنين)"
     ]
   , prod = \_ -> integer 2
   }
@@ -201,7 +201,7 @@
 ruleInteger13 = Rule
   { name = "integer 9"
   , pattern =
-    [ regex "(\x062a\x0633\x0639\x0629|\x062a\x0633\x0639)"
+    [ regex "(تسعة|تسع)"
     ]
   , prod = \_ -> integer 9
   }
@@ -210,7 +210,7 @@
 ruleInteger12 = Rule
   { name = "integer 8"
   , pattern =
-    [ regex "(\x062b\x0645\x0627\x0646\x064a\x0629|\x062b\x0645\x0627\x0646)"
+    [ regex "(ثمانية|ثمان)"
     ]
   , prod = \_ -> integer 8
   }
@@ -232,7 +232,7 @@
 ruleInteger7 = Rule
   { name = "integer 5"
   , pattern =
-    [ regex "(\x062e\x0645\x0633)(\x0629)?"
+    [ regex "(خمس)(ة)?"
     ]
   , prod = \_ -> integer 5
   }
@@ -241,7 +241,7 @@
 ruleInteger14 = Rule
   { name = "integer 10"
   , pattern =
-    [ regex "(\x0639\x0634\x0631\x0629|\x0639\x0634\x0631)"
+    [ regex "(عشرة|عشر)"
     ]
   , prod = \_ -> integer 10
   }
@@ -250,7 +250,7 @@
 ruleInteger9 = Rule
   { name = "integer 6"
   , pattern =
-    [ regex "(\x0633\x062a(\x0629)?)"
+    [ regex "(ست(ة)?)"
     ]
   , prod = \_ -> integer 6
   }
@@ -259,7 +259,7 @@
 ruleInteger = Rule
   { name = "integer 0"
   , pattern =
-    [ regex "(\x0635\x0641\x0631)"
+    [ regex "(صفر)"
     ]
   , prod = \_ -> integer 0
   }
@@ -268,7 +268,7 @@
 ruleInteger4 = Rule
   { name = "integer 3"
   , pattern =
-    [ regex "(\x062b\x0644\x0627\x062b|\x062b\x0644\x0627\x062b\x0629)"
+    [ regex "(ثلاث|ثلاثة)"
     ]
   , prod = \_ -> integer 3
   }
@@ -277,7 +277,7 @@
 ruleInteger2 = Rule
   { name = "integer 1"
   , pattern =
-    [ regex "(\x0648\x0627\x062d\x062f\x0629|\x0648\x0627\x062d\x062f\x0647|\x0648\x0627\x062d\x062f)"
+    [ regex "(واحدة|واحده|واحد)"
     ]
   , prod = \_ -> integer 1
   }
@@ -286,7 +286,7 @@
 ruleInteger11 = Rule
   { name = "integer 7"
   , pattern =
-    [ regex "(\x0633\x0628\x0639\x0629|\x0633\x0628\x0639)"
+    [ regex "(سبعة|سبع)"
     ]
   , prod = \_ -> integer 7
   }
@@ -295,19 +295,19 @@
 ruleInteger20 = Rule
   { name = "integer (100..900)"
   , pattern =
-    [ regex "(\x0645\x0627\x0626\x0629|\x0645\x0627\x0626\x062a\x0627\x0646|\x062b\x0644\x0627\x062b\x0645\x0627\x0626\x0629|\x0623\x0631\x0628\x0639\x0645\x0627\x0626\x0629|\x062e\x0645\x0633\x0645\x0627\x0626\x0629|\x0633\x062a\x0645\x0627\x0626\x0629|\x0633\x0628\x0639\x0645\x0627\x0626\x0629|\x062b\x0645\x0627\x0646\x0645\x0627\x0626\x0629|\x062a\x0633\x0639\x0645\x0627\x0626\x0629)"
+    [ regex "(مائة|مائتان|ثلاثمائة|أربعمائة|خمسمائة|ستمائة|سبعمائة|ثمانمائة|تسعمائة)"
     ]
   , prod = \tokens -> case tokens of
       Token RegexMatch (GroupMatch (match:_)):_ -> case match of
-        "\x0645\x0627\x0626\x0629" -> integer 100
-        "\x0633\x0628\x0639\x0645\x0627\x0626\x0629" -> integer 700
-        "\x062e\x0645\x0633\x0645\x0627\x0626\x0629" -> integer 500
-        "\x0623\x0631\x0628\x0639\x0645\x0627\x0626\x0629" -> integer 400
-        "\x0633\x062a\x0645\x0627\x0626\x0629" -> integer 600
-        "\x0645\x0627\x0626\x062a\x0627\x0646" -> integer 200
-        "\x062b\x0644\x0627\x062b\x0645\x0627\x0626\x0629" -> integer 300
-        "\x062b\x0645\x0627\x0646\x0645\x0627\x0626\x0629" -> integer 800
-        "\x062a\x0633\x0639\x0645\x0627\x0626\x0629" -> integer 900
+        "مائة" -> integer 100
+        "سبعمائة" -> integer 700
+        "خمسمائة" -> integer 500
+        "أربعمائة" -> integer 400
+        "ستمائة" -> integer 600
+        "مائتان" -> integer 200
+        "ثلاثمائة" -> integer 300
+        "ثمانمائة" -> integer 800
+        "تسعمائة" -> integer 900
         _ -> Nothing
       _ -> Nothing
   }
@@ -317,7 +317,7 @@
   { name = "number dot number"
   , pattern =
     [ dimension Numeral
-    , regex "\x0641\x0627\x0635\x0644\x0629"
+    , regex "فاصلة"
     , numberWith TNumeral.grain isNothing
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/BG/Corpus.hs b/Duckling/Numeral/BG/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/BG/Corpus.hs
@@ -0,0 +1,127 @@
+-- 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.BG.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 BG Nothing}, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "нула"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "един"
+             , "една"
+             , "едно"
+             ]
+  , examples (NumeralValue 2)
+             [ "2"
+             , "02"
+             , "две"
+             , "два"
+             ]
+  , examples (NumeralValue 3)
+             [ "3"
+             , "03"
+             , "три"
+             ]
+  , examples (NumeralValue 4)
+             [ "4"
+             , "04"
+             , "четири"
+             ]
+  , examples (NumeralValue 5)
+             [ "5"
+             , "05"
+             , "пет"
+             ]
+  , examples (NumeralValue 33)
+             [ "33"
+             , "0033"
+             , "тридесет и три"
+             ]
+  , examples (NumeralValue 14)
+             [ "14"
+             , "четиринадесет"
+             , "четиринайсет"
+             ]
+  , examples (NumeralValue 15)
+             [ "15"
+             , "петнадесет"
+             , "петнайсет"
+             ]
+  , examples (NumeralValue 16)
+             [ "16"
+             , "шестнадесет"
+             , "шестнайсет"
+             ]
+  , examples (NumeralValue 17)
+             [ "17"
+             , "седемнадесет"
+             , "седемнайсет"
+             ]
+  , examples (NumeralValue 18)
+             [ "18"
+             , "осемнадесет"
+             , "осемнайсет"
+             ]
+  , examples (NumeralValue 525)
+             [ "525"
+             , "петстотин двадесет и пет"
+             ]
+  , examples (NumeralValue 1.1)
+             [ "1.1"
+             , "1.10"
+             , "01.10"
+             , "1 цяло и 1"
+             , "едно цяло и едно"
+             ]
+  , examples (NumeralValue 0.77)
+             [ "0.77"
+             , ".77"
+             ]
+  , examples (NumeralValue 100000)
+             [ "100000"
+             , "100к"
+             , "100К"
+             ]
+  , examples (NumeralValue 3000000)
+             [ "3М"
+             , "3000К"
+             , "3000000"
+             , "3,000,000"
+             ]
+  , examples (NumeralValue 1200000)
+             [ "1200000"
+             , "1.2М"
+             , "1200К"
+             , ".0012Г"
+             ]
+  , examples (NumeralValue (-1200000))
+             [ "-1200000"
+             , "минус 1200000"
+             , "-1.2М"
+             , "-1200К"
+             , "-.0012Г"
+             ]
+  ]
diff --git a/Duckling/Numeral/BG/Rules.hs b/Duckling/Numeral/BG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/BG/Rules.hs
@@ -0,0 +1,273 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.BG.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
+
+ruleIntegers :: Rule
+ruleIntegers = Rule
+  { name = "integer (numeric)"
+  , pattern =
+    [ regex "(\\d{1,18})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        v <- parseInt match
+        integer $ toInteger v
+      _ -> Nothing
+  }
+
+zeroNineteenMap :: HashMap Text Integer
+zeroNineteenMap = HashMap.fromList
+  [ ( "нула", 0 )
+  , ( "един", 1 )
+  , ( "една", 1 )
+  , ( "едно", 1 )
+  , ( "два", 2 )
+  , ( "две", 2 )
+  , ( "три", 3 )
+  , ( "четири", 4 )
+  , ( "пет", 5)
+  , ( "шест", 6)
+  , ( "седем", 7)
+  , ( "осем", 8)
+  , ( "девет", 9)
+  , ( "десет", 10)
+  , ( "единадесет", 11 )
+  , ( "единайсет", 11 )
+  , ( "дванадесет", 12 )
+  , ( "дванайсет", 12 )
+  , ( "тринадесет", 13 )
+  , ( "тринайсет", 13 )
+  , ( "четиринадесет", 14)
+  , ( "четиринайсет", 14)
+  , ( "петнадесет", 15)
+  , ( "петнайсет", 15)
+  , ( "шестнадесет", 16)
+  , ( "шестнайсет", 16)
+  , ( "седемнадесет", 17)
+  , ( "седемнайсет", 17)
+  , ( "осемнадесет", 18)
+  , ( "осемнайсет", 18)
+  , ( "деветнадесет", 19)
+  , ( "деветнайсет", 19)
+  ]
+
+ruleToNineteen :: Rule
+ruleToNineteen = Rule
+  { name = "number (0..19)"
+  , pattern =
+    [ regex "(нула|едина(де|й)сет|двана(де|й)сет|трина(де|й)сет|четирина(де|й)сет|петна(де|й)сет|шестна(де|й)сет|седемна(де|й)сет|осемна(де|й)сет|деветна(де|й)сет|един|една|едно|два|две|три|четири|пет|шест|седем|осем|девет|десет)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        let x = Text.toLower match in
+        HashMap.lookup x zeroNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "((два|три|четири|пет|шест|седем|осем|девет)десет)"
+    ]
+  , prod = \tokens ->
+      case tokens of
+        (Token RegexMatch (GroupMatch (_:match:_)):_) -> do
+          x <- HashMap.lookup (Text.toLower match) zeroNineteenMap
+          integer $ x * 10
+        _ -> Nothing
+  }
+
+rulePowersOfTen :: Rule
+rulePowersOfTen = Rule
+  { name = "powers of tens"
+  , pattern =
+    [ regex "(хиляд(а|и)|милион(а|и)?|милиард(а|и)?)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "хиляд"   -> double 1e3 >>= withGrain 3 >>= withMultipliable
+        "милион"  -> double 1e6 >>= withGrain 6 >>= withMultipliable
+        "милиард" -> double 1e9 >>= withGrain 9 >>= withMultipliable
+        _         -> Nothing
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer 21..99"
+  , pattern =
+    [ oneOf [20, 30..90]
+    , regex "и"
+    , numberBetween 1 10
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral (NumeralData {TNumeral.value = tens}):
+       _:
+       Token Numeral (NumeralData {TNumeral.value = units}):
+       _) -> double $ tens + units
+      _ -> Nothing
+  }
+
+ruleHundreds :: Rule
+ruleHundreds = Rule
+  { name = "integer (100..900)"
+  , pattern =
+    [ regex "(сто|двеста|триста|(четири|пет|шест|седем|осем|девет)стотин)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
+        "сто"          -> integer 100
+        "двеста"       -> integer 200
+        "триста"       -> integer 300
+        "четиристотин" -> integer 400
+        "петстотин"    -> integer 500
+        "шестстотин"   -> integer 600
+        "седемстотин"  -> integer 700
+        "осемстотин"   -> integer 800
+        "деветстотин"  -> integer 900
+        _              -> Nothing
+      _ -> Nothing
+  }
+
+ruleCompositeHundreds :: Rule
+ruleCompositeHundreds = Rule
+  { name = "integer 101..999"
+  , pattern =
+    [ oneOf [200, 300..900]
+    , numberBetween 1 100
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral (NumeralData {TNumeral.value = hundreds}):
+       Token Numeral (NumeralData {TNumeral.value = tens}):
+       _) -> double $ hundreds + tens
+      _ -> Nothing
+  }
+
+ruleDotSpelledOut :: Rule
+ruleDotSpelledOut = Rule
+  { name = "one point 2"
+  , pattern =
+    [ dimension Numeral
+    , regex "цяло и"
+    , numberWith TNumeral.grain isNothing
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral nd1:_:Token Numeral nd2:_) ->
+        double $ TNumeral.value nd1 + decimalsToDouble (TNumeral.value nd2)
+      _ -> Nothing
+  }
+
+ruleDecimals :: Rule
+ruleDecimals = Rule
+  { name = "decimal number"
+  , pattern =
+    [ regex "(\\d*\\.\\d+)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal True match
+      _ -> Nothing
+  }
+
+ruleFractions :: Rule
+ruleFractions = Rule
+  { name = "fractional number"
+  , pattern =
+    [ regex "(\\d+)/(\\d+)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (numerator:denominator:_)):_) -> do
+        n <- parseDecimal False numerator
+        d <- parseDecimal False denominator
+        divide n d
+      _ -> Nothing
+  }
+
+ruleCommas :: Rule
+ruleCommas = Rule
+  { name = "comma-separated numbers"
+  , pattern =
+    [ regex "(\\d+(,\\d\\d\\d)+(\\.\\d+)?)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        parseDouble (Text.replace (Text.singleton ',') Text.empty match) >>= double
+      _ -> Nothing
+  }
+
+ruleSuffixes :: Rule
+ruleSuffixes = Rule
+  { name = "suffixes (K,M,G))"
+  , pattern =
+    [ dimension Numeral
+    , regex "((к|м|г)|(К|М|Г))(?=[\\W$€¢£]|$)"
+    ]
+  , prod = \tokens ->
+      case tokens of
+        (Token Numeral nd : Token RegexMatch (GroupMatch (match : _)):_) -> do
+          x <- case Text.toLower match of
+            "к" -> Just 1e3
+            "К" -> Just 1e3
+            "м" -> Just 1e6
+            "М" -> Just 1e6
+            "г" -> Just 1e9
+            "Г" -> Just 1e9
+            _ -> Nothing
+          double $ TNumeral.value nd * x
+        _ -> Nothing
+  }
+
+ruleNegative :: Rule
+ruleNegative = Rule
+  { name = "negative numbers"
+  , pattern =
+    [ regex "-|минус\\s?"
+    , dimension Numeral
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Numeral nd:_) -> double (TNumeral.value nd * (-1))
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntegers
+  , ruleToNineteen
+  , ruleTens
+  , rulePowersOfTen
+  , ruleCompositeTens
+  , ruleHundreds
+  , ruleCompositeHundreds
+  , ruleDotSpelledOut
+  , ruleDecimals
+  , ruleFractions
+  , ruleCommas
+  , ruleSuffixes
+  , ruleNegative
+  ]
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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = CS}, allExamples)
+corpus = (testContext {locale = makeLocale CS Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/CS/Rules.hs b/Duckling/Numeral/CS/Rules.hs
--- a/Duckling/Numeral/CS/Rules.hs
+++ b/Duckling/Numeral/CS/Rules.hs
@@ -50,9 +50,9 @@
   , ( "dva", 2 )
   , ( "dv\x0115", 2 )
   , ( "t\x0159i", 3 )
-  , ( "\x010dty\x0159i", 4 )
+  , ( "čty\x0159i", 4 )
   , ( "p\x0115t", 5)
-  , ( "\x0161est", 6)
+  , ( "šest", 6)
   , ( "sedm", 7)
   , ( "osm", 8)
   , ( "dev\x0115t", 9)
@@ -63,7 +63,7 @@
 ruleNumeral = Rule
   { name = "number (0..10)"
   , pattern =
-    [ regex "(nula|jed(en|n[ao])|dv(a|\x0115)|t(\x0159)i|(\x010d)ty(\x0159)i|p(\x0115)t|(\x0161)est|sedm|osm|dev(\x0115)t|deset)"
+    [ regex "(nula|jed(en|n[ao])|dv(a|\x0115)|t(\x0159)i|(č)ty(\x0159)i|p(\x0115)t|(š)est|sedm|osm|dev(\x0115)t|deset)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = DA}, allExamples)
+corpus = (testContext {locale = makeLocale DA Nothing}, 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
@@ -57,7 +57,7 @@
 ruleFew = Rule
   { name = "few"
   , pattern =
-    [ regex "(nogle )?f\x00e5"
+    [ regex "(nogle )?få"
     ]
   , prod = \_ -> integer 3
   }
@@ -137,7 +137,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -221,8 +221,8 @@
   , ("intet", 0)
   , ("en", 1)
   , ("et", 1)
-  , ("\x00e9n", 1)
-  , ("\x00e9t", 1)
+  , ("én", 1)
+  , ("ét", 1)
   , ("to", 2)
   , ("tre", 3)
   , ("fire", 4)
@@ -247,7 +247,7 @@
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(intet|ingen|nul|en|et|\x00e9n|\x00e9t|to|tretten|tre|fire|femten|fem|seksten|seks|syv|otte|nitten|ni|ti|elleve|tolv|fjorten|sytten|atten)"
+    [ regex "(intet|ingen|nul|en|et|én|ét|to|tretten|tre|fire|femten|fem|seksten|seks|syv|otte|nitten|ni|ti|elleve|tolv|fjorten|sytten|atten)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = DE}, allExamples)
+corpus = (testContext {locale = makeLocale DE Nothing}, 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
@@ -103,7 +103,7 @@
 ruleInteger3 = Rule
   { name = "integer ([2-9][1-9])"
   , pattern =
-    [ regex "(ein|zwei|drei|vier|f\x00fcnf|sechs|sieben|acht|neun)und(zwanzig|dreissig|vierzig|f\x00fcnfzig|sechzig|siebzig|achtzig|neunzig)"
+    [ regex "(ein|zwei|drei|vier|fünf|sechs|sieben|acht|neun)und(zwanzig|dreissig|vierzig|fünfzig|sechzig|siebzig|achtzig|neunzig)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
@@ -112,7 +112,7 @@
           "zwei" -> Just 2
           "drei" -> Just 3
           "vier" -> Just 4
-          "f\x00fcnf" -> Just 5
+          "fünf" -> Just 5
           "sechs" -> Just 6
           "sieben" -> Just 7
           "acht" -> Just 8
@@ -122,7 +122,7 @@
           "zwanzig" -> Just 20
           "dreissig" -> Just 30
           "vierzig" -> Just 40
-          "f\x00fcnfzig" -> Just 50
+          "fünfzig" -> Just 50
           "sechzig" -> Just 60
           "siebzig" -> Just 70
           "achtzig" -> Just 80
@@ -179,7 +179,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -246,17 +246,17 @@
   , ("zwei", 2)
   , ("drei", 3)
   , ("vier", 4)
-  , ("f\x00fcnf", 5)
+  , ("fünf", 5)
   , ("sechs", 6)
   , ("sieben", 7)
   , ("acht", 8)
   , ("neun", 9)
   , ("zehn", 10)
   , ("elf", 11)
-  , ("zw\x00f6lf", 12)
+  , ("zwölf", 12)
   , ("dreizehn", 13)
   , ("vierzehn", 14)
-  , ("f\x00fcnfzehn", 15)
+  , ("fünfzehn", 15)
   , ("sechzehn", 16)
   , ("siebzehn", 17)
   , ("achtzehn", 18)
@@ -268,7 +268,7 @@
   { name = "integer (0..19)"
   -- e.g. fourteen must be before four,
   -- otherwise four will always shadow fourteen
-  , pattern = [regex "(keine?|keine?s|keiner|keinen|null|nichts|eins?(er)?|zwei|dreizehn|drei|vierzehn|vier|f\x00fcnf|sechzehn|sechs|siebzehn|sieben|achtzehn|acht|neunzehn|neun|elf|zw\x00f6lf|f\x00fcfzehn)"]
+  , pattern = [regex "(keine?|keine?s|keiner|keinen|null|nichts|eins?(er)?|zwei|dreizehn|drei|vierzehn|vier|fünf|sechzehn|sechs|siebzehn|sieben|achtzehn|acht|neunzehn|neun|elf|zwölf|füfzehn)"]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
         HashMap.lookup (Text.toLower match) zeroNineteenMap >>= integer
@@ -279,7 +279,7 @@
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(keine?|keine?s|keiner|keinen|null|nichts|eins?(er)?|zwei|dreizehn|drei|vierzehn|vier|f\x00fcnf|sechzehn|sechs|siebzehn|sieben|achtzehn|acht|neunzehn|neun|elf|zw\x00f6lf|f\x00fcfzehn)"
+    [ regex "(keine?|keine?s|keiner|keinen|null|nichts|eins?(er)?|zwei|dreizehn|drei|vierzehn|vier|fünf|sechzehn|sechs|siebzehn|sieben|achtzehn|acht|neunzehn|neun|elf|zwölf|füfzehn)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -298,17 +298,17 @@
         "zwei" -> integer 2
         "drei" -> integer 3
         "vier" -> integer 4
-        "f\x00fcnf" -> integer 5
+        "fünf" -> integer 5
         "sechs" -> integer 6
         "sieben" -> integer 7
         "acht" -> integer 8
         "neun" -> integer 9
         "zehn" -> integer 10
         "elf" -> integer 11
-        "zw\x00f6lf" -> integer 12
+        "zwölf" -> integer 12
         "dreizehn" -> integer 13
         "vierzehn" -> integer 14
-        "f\x00fcnfzehn" -> integer 15
+        "fünfzehn" -> integer 15
         "sechzehn" -> integer 16
         "siebzehn" -> integer 17
         "achtzehn" -> integer 18
@@ -321,14 +321,14 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(zwanzig|dreissig|vierzig|f\x00fcnfzig|sechzig|siebzig|achtzig|neunzig)"
+    [ regex "(zwanzig|dreissig|vierzig|fünfzig|sechzig|siebzig|achtzig|neunzig)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "zwanzig" -> integer 20
         "dreissig" -> integer 30
         "vierzig" -> integer 40
-        "f\x00fcnfzig" -> integer 50
+        "fünfzig" -> integer 50
         "sechzig" -> integer 60
         "siebzig" -> integer 70
         "achtzig" -> integer 80
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
@@ -234,7 +234,7 @@
   { name = "suffixes (K,M,G))"
   , pattern =
     [ dimension Numeral
-    , regex "(k|m|g)(?=[\\W$\x20ac\x00a2\x00a3]|$)"
+    , regex "(k|m|g)(?=[\\W$€¢£]|$)"
     ]
   , prod = \tokens ->
       case tokens of
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ES}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, 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
@@ -110,12 +110,12 @@
   , ( "una" , 1 )
   , ( "uno" , 1 )
   , ( "dos" , 2 )
-  , ( "tr\x00e9s" , 3 )
+  , ( "trés" , 3 )
   , ( "tres" , 3 )
   , ( "cuatro" , 4 )
   , ( "cinco" , 5 )
   , ( "seis" , 6 )
-  , ( "s\x00e9is" , 6 )
+  , ( "séis" , 6 )
   , ( "siete" , 7 )
   , ( "ocho" , 8 )
   , ( "nueve" , 9 )
@@ -132,7 +132,7 @@
 ruleNumeral = Rule
   { name = "number (0..15)"
   , pattern =
-    [ regex "((c|z)ero|un(o|a)?|dos|tr(\x00e9|e)s|cuatro|cinco|s(e|\x00e9)is|siete|ocho|nueve|die(z|s)|once|doce|trece|catorce|quince)"
+    [ regex "((c|z)ero|un(o|a)?|dos|tr(é|e)s|cuatro|cinco|s(e|é)is|siete|ocho|nueve|die(z|s)|once|doce|trece|catorce|quince)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -143,20 +143,20 @@
 sixteenToTwentyNineMap :: HashMap.HashMap Text.Text Integer
 sixteenToTwentyNineMap = HashMap.fromList
   [ ( "dieciseis" , 16 )
-  , ( "diesis\x00e9is" , 16 )
+  , ( "diesiséis" , 16 )
   , ( "diesiseis" , 16 )
-  , ( "diecis\x00e9is" , 16 )
+  , ( "dieciséis" , 16 )
   , ( "diecisiete" , 17 )
   , ( "dieciocho" , 18 )
   , ( "diecinueve" , 19 )
   , ( "veintiuno" , 21 )
   , ( "veintiuna" , 21 )
   , ( "veintidos" , 22 )
-  , ( "veintitr\x00e9s" , 23 )
+  , ( "veintitrés" , 23 )
   , ( "veintitres" , 23 )
   , ( "veinticuatro" , 24 )
   , ( "veinticinco" , 25 )
-  , ( "veintis\x00e9is" , 26 )
+  , ( "veintiséis" , 26 )
   , ( "veintiseis" , 26 )
   , ( "veintisiete" , 27 )
   , ( "veintiocho" , 28 )
@@ -167,7 +167,7 @@
 ruleNumeral5 = Rule
   { name = "number (16..19 21..29)"
   , pattern =
-    [ regex "(die(c|s)is(\x00e9|e)is|diecisiete|dieciocho|diecinueve|veintiun(o|a)|veintidos|veintitr(\x00e9|e)s|veinticuatro|veinticinco|veintis(\x00e9|e)is|veintisiete|veintiocho|veintinueve)"
+    [ regex "(die(c|s)is(é|e)is|diecisiete|dieciocho|diecinueve|veintiun(o|a)|veintidos|veintitr(é|e)s|veinticuatro|veinticinco|veintis(é|e)is|veintisiete|veintiocho|veintinueve)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -194,7 +194,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ET}, allExamples)
+corpus = (testContext {locale = makeLocale ET Nothing}, 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
@@ -77,7 +77,7 @@
 ruleTen = Rule
   { name = "ten"
   , pattern =
-    [ regex "k\x00fcmme"
+    [ regex "kümme"
     ]
   , prod = \_ -> integer 10 >>= withGrain 1
   }
@@ -122,7 +122,7 @@
 ruleAFew = Rule
   { name = "(a )?few"
   , pattern =
-    [ regex "m\x00f5ni"
+    [ regex "mõni"
     ]
   , prod = \_ -> integer 3
   }
@@ -158,7 +158,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -187,12 +187,12 @@
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(null|\x00fcksteist|\x00fcks|kaksteist|kaks|kolmteist|kolm|neliteist|neli|viisteist|viis|kuusteist|kuus|seitseteist|seitse|kaheksateist|kaheksa|\x00fcheksateist|\x00fcheksa|k\x00fcmme)"
+    [ regex "(null|üksteist|üks|kaksteist|kaks|kolmteist|kolm|neliteist|neli|viisteist|viis|kuusteist|kuus|seitseteist|seitse|kaheksateist|kaheksa|üheksateist|üheksa|kümme)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "null" -> integer 0
-        "\x00fcks" -> integer 1
+        "üks" -> integer 1
         "kaks" -> integer 2
         "kolm" -> integer 3
         "neli" -> integer 4
@@ -200,9 +200,9 @@
         "kuus" -> integer 6
         "seitse" -> integer 7
         "kaheksa" -> integer 8
-        "\x00fcheksa" -> integer 9
-        "k\x00fcmme" -> integer 10
-        "\x00fcksteist" -> integer 11
+        "üheksa" -> integer 9
+        "kümme" -> integer 10
+        "üksteist" -> integer 11
         "kaksteist" -> integer 12
         "kolmteist" -> integer 13
         "neliteist" -> integer 14
@@ -210,7 +210,7 @@
         "kuusteist" -> integer 16
         "seitseteist" -> integer 17
         "kaheksateist" -> integer 18
-        "\x00fcheksateist" -> integer 19
+        "üheksateist" -> integer 19
         _ -> Nothing
       _ -> Nothing
   }
@@ -219,7 +219,7 @@
 ruleInteger4 = Rule
   { name = "integer (200..900)"
   , pattern =
-    [ regex "(kakssada|kolmsada|nelisada|viissada|kuussada|seitsesada|kaheksasada|\x00fcheksasada)"
+    [ regex "(kakssada|kolmsada|nelisada|viissada|kuussada|seitsesada|kaheksasada|üheksasada)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -230,7 +230,7 @@
         "kuussada"        -> integer 600 >>= withGrain 2 >>= withMultipliable
         "seitsesada"      -> integer 700 >>= withGrain 2 >>= withMultipliable
         "kaheksasada"     -> integer 800 >>= withGrain 2 >>= withMultipliable
-        "\x00fcheksasada" -> integer 900 >>= withGrain 2 >>= withMultipliable
+        "üheksasada" -> integer 900 >>= withGrain 2 >>= withMultipliable
         _ -> Nothing
       _ -> Nothing
   }
@@ -239,18 +239,18 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "((kaks|kolm|neli|viis|kuus|seitse|kaheksa|(\x00fc)heksa)k(\x00fc)mmend)"
+    [ regex "((kaks|kolm|neli|viis|kuus|seitse|kaheksa|(ü)heksa)k(ü)mmend)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "kaksk\x00fcmmend" -> integer 20
-        "kolmk\x00fcmmend" -> integer 30
-        "nelik\x00fcmmend" -> integer 40
-        "viisk\x00fcmmend" -> integer 50
-        "kuusk\x00fcmmend" -> integer 60
-        "seitsek\x00fcmmend" -> integer 70
-        "kaheksak\x00fcmmend" -> integer 80
-        "\x00fcheksak\x00fcmmend" -> integer 90
+        "kakskümmend" -> integer 20
+        "kolmkümmend" -> integer 30
+        "nelikümmend" -> integer 40
+        "viiskümmend" -> integer 50
+        "kuuskümmend" -> integer 60
+        "seitsekümmend" -> integer 70
+        "kaheksakümmend" -> integer 80
+        "üheksakümmend" -> integer 90
         _ -> Nothing
       _ -> Nothing
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, 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
@@ -144,7 +144,7 @@
 ruleNumeralMap :: HashMap Text Integer
 ruleNumeralMap = HashMap.fromList
   [ ( "zero"     , 0 )
-  , ( "z\x00e9ro", 0 )
+  , ( "zéro", 0 )
   , ( "un"       , 1 )
   , ( "une"      , 1 )
   , ( "deux"     , 2 )
@@ -168,7 +168,7 @@
 ruleNumeral = Rule
   { name = "number (0..16)"
   , pattern =
-    [ regex "(z(e|\x00e9)ro|une?|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize)"
+    [ regex "(z(e|é)ro|une?|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -211,7 +211,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W$\x20ac\x00a2\x00a3]|$)"
+    , regex "([kmg])(?=[\\W$€¢£]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/GA/Rules.hs b/Duckling/Numeral/GA/Rules.hs
--- a/Duckling/Numeral/GA/Rules.hs
+++ b/Duckling/Numeral/GA/Rules.hs
@@ -27,7 +27,7 @@
 ruleNumeralsPrefixWithNegativeOrMinus = Rule
   { name = "numbers prefix with -, negative or minus"
   , pattern =
-    [ regex "-|m(\x00ed|i)neas(\\sa)?\\s?"
+    [ regex "-|m(í|i)neas(\\sa)?\\s?"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -54,19 +54,19 @@
 ruleNumerals2 = Rule
   { name = "numbers, 1-10"
   , pattern =
-    [ regex "(aon|dh(\x00e1|a)|tr(\x00ed|i)|ceithre|c(\x00fa|u)ig|seacht|s(\x00e9|e)|ocht|naoi|deich)"
+    [ regex "(aon|dh(á|a)|tr(í|i)|ceithre|c(ú|u)ig|seacht|s(é|e)|ocht|naoi|deich)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "aon" -> integer 1
         "dha" -> integer 2
-        "dh\x00e1" -> integer 2
-        "tr\x00ed" -> integer 3
+        "dhá" -> integer 2
+        "trí" -> integer 3
         "tri" -> integer 3
         "ceithre" -> integer 4
         "cuig" -> integer 5
-        "c\x00faig" -> integer 5
-        "s\x00e9" -> integer 6
+        "cúig" -> integer 5
+        "sé" -> integer 6
         "se" -> integer 6
         "seacht" -> integer 7
         "ocht" -> integer 8
@@ -103,7 +103,7 @@
 ruleDag = Rule
   { name = "déag"
   , pattern =
-    [ regex "d(\x00e9|e)ag"
+    [ regex "d(é|e)ag"
     ]
   , prod = \_ -> integer 10
   }
@@ -113,7 +113,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -130,15 +130,15 @@
 ruleOldVigesimalNumeralsS = Rule
   { name = "old vigesimal numbers, 20s"
   , pattern =
-    [ regex "is (dh?(\x00e1|a) fhichead|tr(\x00ed|i) fichid|ceithre fichid)"
+    [ regex "is (dh?(á|a) fhichead|tr(í|i) fichid|ceithre fichid)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "d\x00e1 fhichead" -> integer 40
+        "dá fhichead" -> integer 40
         "da fhichead" -> integer 40
-        "dh\x00e1 fhichead" -> integer 40
+        "dhá fhichead" -> integer 40
         "dha fhichead" -> integer 40
-        "tr\x00ed fichid" -> integer 60
+        "trí fichid" -> integer 60
         "tri fichid" -> integer 60
         "ceithre fichid" -> integer 80
         _ -> Nothing
@@ -149,16 +149,16 @@
 ruleOldVigesimalNumeralsS2 = Rule
   { name = "old vigesimal numbers, 20s + 10"
   , pattern =
-    [ regex "d(\x00e9|e)ag is (fiche|dh?(\x00e1|a) fhichead|tr(\x00ed|i) fichid|ceithre fichid)"
+    [ regex "d(é|e)ag is (fiche|dh?(á|a) fhichead|tr(í|i) fichid|ceithre fichid)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "fiche" -> integer 30
-        "d\x00e1 fhichead" -> integer 50
+        "dá fhichead" -> integer 50
         "da fhichead" -> integer 50
-        "dh\x00e1 fhichead" -> integer 50
+        "dhá fhichead" -> integer 50
         "dha fhichead" -> integer 50
-        "tr\x00ed fichid" -> integer 70
+        "trí fichid" -> integer 70
         "tri fichid" -> integer 70
         "ceithre fichid" -> integer 90
         _ -> Nothing
@@ -169,7 +169,7 @@
 ruleAmhin = Rule
   { name = "amháin"
   , pattern =
-    [ regex "amh(\x00e1|a)in"
+    [ regex "amh(á|a)in"
     ]
   , prod = \_ -> integer 1
   }
@@ -178,21 +178,21 @@
 ruleNumerals = Rule
   { name = "numbers, 20-90"
   , pattern =
-    [ regex "(fiche|tr(\x00ed|i)ocha|daichead|caoga|seasca|seacht(\x00f3|o)|ocht(\x00f3|o)|n(\x00f3|o)cha)"
+    [ regex "(fiche|tr(í|i)ocha|daichead|caoga|seasca|seacht(ó|o)|ocht(ó|o)|n(ó|o)cha)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "fiche" -> integer 20
         "triocha" -> integer 30
-        "tr\x00edocha" -> integer 30
+        "tríocha" -> integer 30
         "daichead" -> integer 40
         "caoga" -> integer 50
         "seasca" -> integer 60
         "seachto" -> integer 70
-        "seacht\x00f3" -> integer 70
+        "seachtó" -> integer 70
         "ochto" -> integer 80
-        "ocht\x00f3" -> integer 80
-        "n\x00f3cha" -> integer 90
+        "ochtó" -> integer 80
+        "nócha" -> integer 90
         "nocha" -> integer 90
         _ -> Nothing
       _ -> Nothing
@@ -214,21 +214,21 @@
 ruleCountNumerals = Rule
   { name = "count numbers"
   , pattern =
-    [ regex "a (n(\x00e1|a)id|haon|d(\x00f3|o)|tr(\x00ed|i)|ceathair|c(\x00fa|u)ig|s(\x00e9|e)|seacht|hocht|naoi|deich)"
+    [ regex "a (n(á|a)id|haon|d(ó|o)|tr(í|i)|ceathair|c(ú|u)ig|s(é|e)|seacht|hocht|naoi|deich)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "naid" -> integer 0
-        "n\x00e1id" -> integer 0
+        "náid" -> integer 0
         "haon" -> integer 1
-        "d\x00f3" -> integer 2
+        "dó" -> integer 2
         "do" -> integer 2
-        "tr\x00ed" -> integer 3
+        "trí" -> integer 3
         "tri" -> integer 3
         "ceathair" -> integer 4
         "cuig" -> integer 5
-        "c\x00faig" -> integer 5
-        "s\x00e9" -> integer 6
+        "cúig" -> integer 5
+        "sé" -> integer 6
         "se" -> integer 6
         "seacht" -> integer 7
         "hocht" -> integer 8
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HE}, allExamples)
+corpus = (testContext {locale = makeLocale HE Nothing}, 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
@@ -28,7 +28,7 @@
 ruleInteger5 = Rule
   { name = "integer 4"
   , pattern =
-    [ regex "(\x05d0\x05e8\x05d1\x05e2(\x05d4)?)"
+    [ regex "(ארבע(ה)?)"
     ]
   , prod = \_ -> integer 4
   }
@@ -52,7 +52,7 @@
   { name = "intersect (with and)"
   , pattern =
     [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
-    , regex "\x05d5"
+    , regex "ו"
     , numberWith TNumeral.multipliable not
     ]
   , prod = \tokens -> case tokens of
@@ -82,7 +82,7 @@
   { name = "integer 21..99 (with and)"
   , pattern =
     [ oneOf [ 20, 30..90 ]
-    , regex "\x05d5"
+    , regex "ו"
     , numberBetween 1 10
     ]
   , prod = \tokens -> case tokens of
@@ -97,7 +97,7 @@
 ruleNumeralsPrefixWithNegativeOrMinus = Rule
   { name = "numbers prefix with -, negative or minus"
   , pattern =
-    [ regex "-|\x05de\x05d9\x05e0\x05d5\x05e1"
+    [ regex "-|מינוס"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -122,7 +122,7 @@
 ruleInteger10 = Rule
   { name = "integer 9"
   , pattern =
-    [ regex "(\x05ea\x05e9\x05e2(\x05d4)?)"
+    [ regex "(תשע(ה)?)"
     ]
   , prod = \_ -> integer 9
   }
@@ -131,18 +131,18 @@
 ruleInteger15 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(\x05e2\x05e9\x05e8\x05d9\x05dd|\x05e9\x05dc\x05d5\x05e9\x05d9\x05dd|\x05d0\x05e8\x05d1\x05e2\x05d9\x05dd|\x05d7\x05de\x05d9\x05e9\x05d9\x05dd|\x05e9\x05d9\x05e9\x05d9\x05dd|\x05e9\x05d1\x05e2\x05d9\x05dd|\x05e9\x05de\x05d5\x05e0\x05d9\x05dd|\x05ea\x05e9\x05e2\x05d9\x05dd)"
+    [ regex "(עשרים|שלושים|ארבעים|חמישים|שישים|שבעים|שמונים|תשעים)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x05e2\x05e9\x05e8\x05d9\x05dd" -> integer 20
-        "\x05e9\x05dc\x05d5\x05e9\x05d9\x05dd" -> integer 30
-        "\x05d0\x05e8\x05d1\x05e2\x05d9\x05dd" -> integer 40
-        "\x05d7\x05de\x05d9\x05e9\x05d9\x05dd" -> integer 50
-        "\x05e9\x05d9\x05e9\x05d9\x05dd" -> integer 60
-        "\x05e9\x05d1\x05e2\x05d9\x05dd" -> integer 70
-        "\x05e9\x05de\x05d5\x05e0\x05d9\x05dd" -> integer 80
-        "\x05ea\x05e9\x05e2\x05d9\x05dd" -> integer 90
+        "עשרים" -> integer 20
+        "שלושים" -> integer 30
+        "ארבעים" -> integer 40
+        "חמישים" -> integer 50
+        "שישים" -> integer 60
+        "שבעים" -> integer 70
+        "שמונים" -> integer 80
+        "תשעים" -> integer 90
         _ -> Nothing
       _ -> Nothing
   }
@@ -162,7 +162,7 @@
 ruleInteger3 = Rule
   { name = "integer 2"
   , pattern =
-    [ regex "(\x05e9\x05ea\x05d9\x05d9\x05dd|\x05e9\x05e0\x05d9\x05d9\x05dd)"
+    [ regex "(שתיים|שניים)"
     ]
   , prod = \_ -> integer 2
   }
@@ -171,7 +171,7 @@
 ruleSingle = Rule
   { name = "single"
   , pattern =
-    [ regex "\x05d9\x05d7\x05d9\x05d3"
+    [ regex "יחיד"
     ]
   , prod = \_ -> integer 1
   }
@@ -180,7 +180,7 @@
 ruleInteger13 = Rule
   { name = "integer 12"
   , pattern =
-    [ regex "(\x05e9\x05e0\x05d9\x05d9\x05dd \x05e2\x05e9\x05e8|\x05ea\x05e8\x05d9 \x05e2\x05e9\x05e8)"
+    [ regex "(שניים עשר|תרי עשר)"
     ]
   , prod = \_ -> integer 12
   }
@@ -201,7 +201,7 @@
 ruleInteger6 = Rule
   { name = "integer 5"
   , pattern =
-    [ regex "(\x05d7\x05de(\x05e9|\x05d9\x05e9\x05d4))"
+    [ regex "(חמ(ש|ישה))"
     ]
   , prod = \_ -> integer 5
   }
@@ -210,21 +210,21 @@
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(\x05de\x05d0(\x05d4|\x05d5\x05ea)|\x05d0\x05dc(\x05e3|\x05e4\x05d9\x05dd)|\x05de\x05d9\x05dc\x05d9\x05d5(\x05df|\x05e0\x05d9\x05dd))"
+    [ regex "(מא(ה|ות)|אל(ף|פים)|מיליו(ן|נים))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "\x05de\x05d0\x05d4"                               ->
+        "מאה"                               ->
           double 1e2 >>= withGrain 2 >>= withMultipliable
-        "\x05de\x05d0\x05d5\x05ea"                         ->
+        "מאות"                         ->
           double 1e2 >>= withGrain 2 >>= withMultipliable
-        "\x05d0\x05dc\x05e3"                               ->
+        "אלף"                               ->
           double 1e3 >>= withGrain 3 >>= withMultipliable
-        "\x05d0\x05dc\x05e4\x05d9\x05dd"                   ->
+        "אלפים"                   ->
           double 1e3 >>= withGrain 3 >>= withMultipliable
-        "\x05de\x05d9\x05dc\x05d9\x05d5\x05df"             ->
+        "מיליון"             ->
           double 1e6 >>= withGrain 6 >>= withMultipliable
-        "\x05de\x05d9\x05dc\x05d9\x05d5\x05e0\x05d9\x05dd" ->
+        "מיליונים" ->
           double 1e6 >>= withGrain 6 >>= withMultipliable
         _          -> Nothing
       _ -> Nothing
@@ -234,7 +234,7 @@
 ruleInteger7 = Rule
   { name = "integer 6"
   , pattern =
-    [ regex "(\x05e9\x05e9(\x05d4)?)"
+    [ regex "(שש(ה)?)"
     ]
   , prod = \_ -> integer 6
   }
@@ -257,7 +257,7 @@
 ruleInteger8 = Rule
   { name = "integer 7"
   , pattern =
-    [ regex "(\x05e9\x05d1\x05e2(\x05d4)?)"
+    [ regex "(שבע(ה)?)"
     ]
   , prod = \_ -> integer 7
   }
@@ -266,7 +266,7 @@
 ruleCouple = Rule
   { name = "couple"
   , pattern =
-    [ regex "\x05d6\x05d5\x05d2( \x05e9\x05dc)?"
+    [ regex "זוג( של)?"
     ]
   , prod = \_ -> integer 2
   }
@@ -289,7 +289,7 @@
 ruleInteger9 = Rule
   { name = "integer 8"
   , pattern =
-    [ regex "(\x05e9\x05de\x05d5\x05e0\x05d4)"
+    [ regex "(שמונה)"
     ]
   , prod = \_ -> integer 8
   }
@@ -298,7 +298,7 @@
 ruleInteger = Rule
   { name = "integer 0"
   , pattern =
-    [ regex "(\x05d0\x05e4\x05e1|\x05db\x05dc\x05d5\x05dd)"
+    [ regex "(אפס|כלום)"
     ]
   , prod = \_ -> integer 0
   }
@@ -307,7 +307,7 @@
 ruleInteger4 = Rule
   { name = "integer 3"
   , pattern =
-    [ regex "(\x05e9\x05dc\x05d5\x05e9(\x05d4)?)"
+    [ regex "(שלוש(ה)?)"
     ]
   , prod = \_ -> integer 3
   }
@@ -316,7 +316,7 @@
 ruleInteger2 = Rule
   { name = "integer 1"
   , pattern =
-    [ regex "(\x05d0\x05d7\x05d3|\x05d0\x05d7\x05ea)"
+    [ regex "(אחד|אחת)"
     ]
   , prod = \_ -> integer 1
   }
@@ -325,7 +325,7 @@
 ruleInteger11 = Rule
   { name = "integer 10"
   , pattern =
-    [ regex "(\x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(עשר(ה)?)"
     ]
   , prod = \_ -> integer 10
   }
@@ -335,7 +335,7 @@
   { name = "number dot number"
   , pattern =
     [ dimension Numeral
-    , regex "\x05e0\x05e7\x05d5\x05d3\x05d4"
+    , regex "נקודה"
     , numberWith TNumeral.grain isNothing
     ]
   , prod = \tokens -> case tokens of
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, 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
@@ -98,7 +98,7 @@
 ruleInteger3 = Rule
   { name = "integer (100..900)"
   , pattern =
-    [ regex "(sto|dvjest(o|a)|tristo|(c|\x010d)etiristo|petsto|(\x0161|s)esto|sedamsto|osamsto|devetsto)"
+    [ regex "(sto|dvjest(o|a)|tristo|(c|č)etiristo|petsto|(š|s)esto|sedamsto|osamsto|devetsto)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -131,7 +131,7 @@
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(stotin(u|a|e)|tisu(c|\x0107)(a|u|e)|milij(u|o)na?)"
+    [ regex "(stotin(u|a|e)|tisu(c|ć)(a|u|e)|milij(u|o)na?)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -187,7 +187,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -222,7 +222,7 @@
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(ni(s|\x0161)ta|ni(s|\x0161)tica|nula|jedanaest|dvanaest|trinaest|jeda?n(a|u|o(ga?)?)?|dv(i?je)?(a|o)?(ma)?|tri(ma)?|(\x010d|c)etiri|(\x010d|c)etrnaest|petnaest|pet|(s|\x0161)esnaest|(\x0161|s)est|sedamnaest|sedam|osamnaest|osam|devetnaest|devet)"
+    [ regex "(ni(s|š)ta|ni(s|š)tica|nula|jedanaest|dvanaest|trinaest|jeda?n(a|u|o(ga?)?)?|dv(i?je)?(a|o)?(ma)?|tri(ma)?|(č|c)etiri|(č|c)etrnaest|petnaest|pet|(s|š)esnaest|(š|s)est|sedamnaest|sedam|osamnaest|osam|devetnaest|devet)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -283,7 +283,7 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(dvadeset|trideset|(c|\x010d)etrdeset|pedeset|(\x0161|s)esdeset|sedamdeset|osamdeset|devedeset)"
+    [ regex "(dvadeset|trideset|(c|č)etrdeset|pedeset|(š|s)esdeset|sedamdeset|osamdeset|devedeset)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -322,7 +322,7 @@
   { name = "number dot number"
   , pattern =
     [ dimension Numeral
-    , regex "cijela|to(c|\x010d)ka|zarez"
+    , regex "cijela|to(c|č)ka|zarez"
     , numberWith TNumeral.grain isNothing
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/HU/Corpus.hs b/Duckling/Numeral/HU/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/HU/Corpus.hs
@@ -0,0 +1,98 @@
+-- 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.HU.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 HU Nothing}, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "nulla"
+             , "zéró"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "egy"
+             ]
+  , examples (NumeralValue 2)
+             [ "kettő"
+             ]
+  , examples (NumeralValue 3)
+             [ "három"
+             ]
+  , examples (NumeralValue 4)
+             [ "négy"
+             ]
+  , examples (NumeralValue 5)
+             [ "öt"
+             ]
+  , examples (NumeralValue 6)
+             [ "hat"
+             ]
+  , examples (NumeralValue 7)
+             [ "hét"
+             ]
+  , examples (NumeralValue 8)
+             [ "nyolc"
+             ]
+  , examples (NumeralValue 9)
+             [ "kilenc"
+             ]
+  , examples (NumeralValue 11)
+             [ "tizenegy"
+             ]
+  , examples (NumeralValue 15)
+             [ "tizenöt"
+             ]
+  , examples (NumeralValue 17)
+             [ "tizenhét"
+             ]
+  , examples (NumeralValue 20)
+             [ "20"
+             , "húsz"
+             ]
+  , examples (NumeralValue 22)
+             [ "huszonkettő"
+             ]
+  , examples (NumeralValue 24)
+             [ "24"
+             , "huszonnégy"
+             ]
+  , examples (NumeralValue 26)
+             [ "huszonhat"
+             ]
+  , examples (NumeralValue 28)
+             [ "huszonnyolc"
+             ]
+  , examples (NumeralValue 10)
+             [ "tíz"
+             ]
+  , examples (NumeralValue 20)
+             [ "húsz"
+             ]
+  , examples (NumeralValue 50)
+             [ "ötven"
+             ]
+  , examples (NumeralValue 34)
+             [ "harmincnégy"
+             ]
+  ]
diff --git a/Duckling/Numeral/HU/Rules.hs b/Duckling/Numeral/HU/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/HU/Rules.hs
@@ -0,0 +1,169 @@
+-- Copyright (c) 2016-present, Facebook, Inc.
+-- All rights reserved.
+--
+-- This source code is licensed under the BSD-style license found in the
+-- LICENSE file in the root directory of this source tree. An additional grant
+-- of patent rights can be found in the PATENTS file in the same directory.
+
+
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+
+module Duckling.Numeral.HU.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
+
+ruleIntegerNumeric :: Rule
+ruleIntegerNumeric = Rule
+  { name = "integer (numeric)"
+  , pattern =
+    [ regex "(\\d{1,18})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+         v <- parseInt match
+         integer $ toInteger v
+      _ -> Nothing
+  }
+
+ruleNumeralMap :: HashMap Text Integer
+ruleNumeralMap = HashMap.fromList
+  [ ( "nulla", 0 )
+  , ( "z\x00E9r\x00F3", 0 )
+  , ( "egy", 1 )
+  , ( "kett\x0151", 2 )
+  , ( "h\x00E1rom", 3 )
+  , ( "n\x00E9gy", 4 )
+  , ( "\x00F6t", 5)
+  , ( "hat", 6)
+  , ( "h\x00E9t", 7)
+  , ( "nyolc", 8)
+  , ( "kilenc", 9)
+  , ( "t\x00EDz", 10)
+  ]
+
+ruleNumeral :: Rule
+ruleNumeral = Rule
+  { name = "number (0..10)"
+  , pattern =
+    [ regex "(nulla|z\x00E9r\x00F3|egy|kett\x0151|h\x00E1rom|n\x00E9gy|\x00F6t|hat|h\x00E9t|nyolc|kilenc|t\x00EDz)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) ruleNumeralMap >>= integer
+      _ -> Nothing
+  }
+
+elevenToNineteenMap :: HashMap Text Integer
+elevenToNineteenMap = HashMap.fromList
+  [ ( "tizenegy", 11 )
+  , ( "tizenkett\x0151", 12 )
+  , ( "tizenh\x00E1rom", 13 )
+  , ( "tizenn\x00E9gy", 14 )
+  , ( "tizen\x00F6t", 15 )
+  , ( "tizenhat", 16 )
+  , ( "tizenh\x00E9t", 17 )
+  , ( "tizennyolc", 18 )
+  , ( "tizenkilenc", 19 )
+  ]
+
+ruleElevenToNineteen :: Rule
+ruleElevenToNineteen = Rule
+  { name = "number (11..19)"
+  , pattern =
+    [ regex "(tizenegy|tizenkett\x0151|tizenh\x00E1rom|tizenn\x00E9gy|tizen\x00F6t|tizenhat|tizenh\x00E9t|tizennyolc|tizenkilenc)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) elevenToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+twentyoneToTwentynineMap :: HashMap Text Integer
+twentyoneToTwentynineMap = HashMap.fromList
+  [ ( "huszonegy", 21 )
+  , ( "huszonkett\x0151", 22 )
+  , ( "huszonh\x00E1rom", 23 )
+  , ( "huszonn\x00E9gy", 24 )
+  , ( "huszon\x00F6t", 25 )
+  , ( "huszonhat", 26 )
+  , ( "huszonh\x00E9t", 27 )
+  , ( "huszonnyolc", 28 )
+  , ( "huszonkilenc", 29 )
+  ]
+
+ruleTwentyoneToTwentynine :: Rule
+ruleTwentyoneToTwentynine = Rule
+  { name = "number (21..29)"
+  , pattern =
+    [ regex "(huszonegy|huszonkett\x0151|huszonh\x00E1rom|huszonn\x00E9gy|huszon\x00F6t|huszonhat|huszonh\x00E9t|huszonnyolc|huszonkilenc)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) twentyoneToTwentynineMap >>= integer
+      _ -> Nothing
+  }
+
+dozensMap :: HashMap Text Integer
+dozensMap = HashMap.fromList
+  [ ( "h\x00FAsz", 20 )
+  , ( "harminc", 30 )
+  , ( "negyven", 40 )
+  , ( "\x00F6tven", 50 )
+  , ( "hatvan", 60 )
+  , ( "hetven", 70 )
+  , ( "nyolcvan", 80 )
+  , ( "kilencven", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20,30..90)"
+  , pattern =
+    [ regex "(h\x00FAsz|harminc|negyven|ötven|hatvan|hetven|nyolcvan|kilencven)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) dozensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([3-9][1-9])"
+  , pattern =
+    [ regex "(harminc|negyven|\x00F6tven|hatvan|hetven|nyolcvan|kilencven)(egy|kett\x0151|h\x00E1rom|n\x00E9gy|\x00F6t|hat|h\x00E9t|nyolc|kilenc)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- HashMap.lookup (Text.toLower m1) dozensMap
+        v2 <- HashMap.lookup (Text.toLower m2) ruleNumeralMap
+        integer $ v1 + v2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntegerNumeric
+  , ruleNumeral
+  , ruleElevenToNineteen
+  , ruleTwentyoneToTwentynine
+  , ruleTens
+  , ruleCompositeTens
+  ]
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ID}, allExamples)
+corpus = (testContext {locale = makeLocale ID Nothing}, 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
@@ -184,7 +184,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = IT}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/IT/Rules.hs b/Duckling/Numeral/IT/Rules.hs
--- a/Duckling/Numeral/IT/Rules.hs
+++ b/Duckling/Numeral/IT/Rules.hs
@@ -174,7 +174,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -191,14 +191,14 @@
 ruleNumeral4 = Rule
   { name = "number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)"
   , pattern =
-    [ regex "((venti|trenta|quaranta|cinquanta|sessanta|settanta|ottanta|novanta)(due|tre|tr\x00e9|quattro|cinque|sei|sette|nove))|((vent|trent|quarant|cinquant|sessant|settant|ottant|novant)(uno|otto))"
+    [ regex "((venti|trenta|quaranta|cinquanta|sessanta|settanta|ottanta|novanta)(due|tre|tré|quattro|cinque|sei|sette|nove))|((vent|trent|quarant|cinquant|sessant|settant|ottant|novant)(uno|otto))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "ventuno" -> integer 21
         "ventidue" -> integer 22
         "ventitre" -> integer 23
-        "ventitr\x00e9" -> integer 23
+        "ventitré" -> integer 23
         "ventiquattro" -> integer 24
         "venticinque" -> integer 25
         "ventisei" -> integer 26
@@ -208,7 +208,7 @@
         "trentuno" -> integer 31
         "trentadue" -> integer 32
         "trentatre" -> integer 33
-        "trentatr\x00e9" -> integer 33
+        "trentatré" -> integer 33
         "trentaquattro" -> integer 34
         "trentacinque" -> integer 35
         "trentasei" -> integer 36
@@ -218,7 +218,7 @@
         "quarantuno" -> integer 41
         "quarantadue" -> integer 42
         "quarantatre" -> integer 43
-        "quarantatr\x00e9" -> integer 43
+        "quarantatré" -> integer 43
         "quarantaquattro" -> integer 44
         "quarantacinque" -> integer 45
         "quarantasei" -> integer 46
@@ -228,7 +228,7 @@
         "cinquantuno" -> integer 51
         "cinquantadue" -> integer 52
         "cinquantatre" -> integer 53
-        "cinquantatr\x00e9" -> integer 53
+        "cinquantatré" -> integer 53
         "cinquantaquattro" -> integer 54
         "cinquantacinque" -> integer 55
         "cinquantasei" -> integer 56
@@ -237,7 +237,7 @@
         "cinquantanove" -> integer 59
         "sessantuno" -> integer 61
         "sessantadue" -> integer 62
-        "sessantatr\x00e9" -> integer 63
+        "sessantatré" -> integer 63
         "sessantatre" -> integer 63
         "sessantaquattro" -> integer 64
         "sessantacinque" -> integer 65
@@ -247,7 +247,7 @@
         "sessantanove" -> integer 69
         "settantuno" -> integer 71
         "settantadue" -> integer 72
-        "settantatr\x00e9" -> integer 73
+        "settantatré" -> integer 73
         "settantatre" -> integer 73
         "settantaquattro" -> integer 74
         "settantacinque" -> integer 75
@@ -257,7 +257,7 @@
         "settantanove" -> integer 79
         "ottantuno" -> integer 81
         "ottantadue" -> integer 82
-        "ottantatr\x00e9" -> integer 83
+        "ottantatré" -> integer 83
         "ottantatre" -> integer 83
         "ottantaquattro" -> integer 84
         "ottantacinque" -> integer 85
@@ -268,7 +268,7 @@
         "novantuno" -> integer 91
         "novantadue" -> integer 92
         "novantatre" -> integer 93
-        "novantatr\x00e9" -> integer 93
+        "novantatré" -> integer 93
         "novantaquattro" -> integer 94
         "novantacinque" -> integer 95
         "novantasei" -> integer 96
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = JA}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/JA/Rules.hs b/Duckling/Numeral/JA/Rules.hs
--- a/Duckling/Numeral/JA/Rules.hs
+++ b/Duckling/Numeral/JA/Rules.hs
@@ -12,7 +12,10 @@
 module Duckling.Numeral.JA.Rules
   ( rules ) where
 
+import qualified Data.HashMap.Strict as HashMap
 import qualified Data.Text as Text
+import Data.HashMap.Strict (HashMap)
+import Data.Text (Text)
 import Prelude
 import Data.String
 
@@ -27,7 +30,7 @@
 ruleInteger5 = Rule
   { name = "integer (100)"
   , pattern =
-    [ regex "\x767e"
+    [ regex "百"
     ]
   , prod = \_ -> integer 100
   }
@@ -36,7 +39,7 @@
 ruleNumeralsPrefixWithNegativeOrMinus = Rule
   { name = "numbers prefix with -, negative or minus"
   , pattern =
-    [ regex "-|\x30de\x30a4\x30ca\x30b9\\s?|\x8ca0\\s?"
+    [ regex "-|マイナス\\s?|負\\s?"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -44,30 +47,6 @@
       _ -> Nothing
   }
 
-ruleInteger17 :: Rule
-ruleInteger17 = Rule
-  { name = "integer (0..10)"
-  , pattern =
-    [ regex "(\x30bc\x30ed|\x96f6|\x4e00|\x4e8c|\x4e09|\x56db|\x4e94|\x516d|\x4e03|\x516b|\x4e5d|\x5341)"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x30bc\x30ed" -> integer 0
-        "\x96f6" -> integer 0
-        "\x4e00" -> integer 1
-        "\x4e8c" -> integer 2
-        "\x4e09" -> integer 3
-        "\x56db" -> integer 4
-        "\x4e94" -> integer 5
-        "\x516d" -> integer 6
-        "\x4e03" -> integer 7
-        "\x516b" -> integer 8
-        "\x4e5d" -> integer 9
-        "\x5341" -> integer 10
-        _ -> Nothing
-      _ -> Nothing
-  }
-
 ruleIntegerNumeric :: Rule
 ruleIntegerNumeric = Rule
   { name = "integer (numeric)"
@@ -85,7 +64,7 @@
 ruleInteger10 = Rule
   { name = "integer (1000..1999)"
   , pattern =
-    [ regex "\x5343"
+    [ regex "千"
     , numberBetween 1 1000
     ]
   , prod = \tokens -> case tokens of
@@ -111,7 +90,7 @@
   { name = "integer (20000..90000)"
   , pattern =
     [ numberBetween 2 10
-    , regex "\x4e07"
+    , regex "万"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 10000
@@ -134,7 +113,7 @@
   { name = "<number>个"
   , pattern =
     [ dimension Numeral
-    , regex "\x4e2a"
+    , regex "个"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> Just token
@@ -146,7 +125,7 @@
   { name = "integer (20..90)"
   , pattern =
     [ numberBetween 2 10
-    , regex "\x5341"
+    , regex "十"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 10
@@ -157,7 +136,7 @@
 ruleInteger13 = Rule
   { name = "integer (10000)"
   , pattern =
-    [ regex "\x4e07"
+    [ regex "万"
     ]
   , prod = \_ -> integer 10000
   }
@@ -166,7 +145,7 @@
 ruleInteger6 = Rule
   { name = "integer (100..199)"
   , pattern =
-    [ regex "\x767e"
+    [ regex "百"
     , numberBetween 1 100
     ]
   , prod = \tokens -> case tokens of
@@ -193,15 +172,15 @@
   { name = "numbers suffixes (K, M, G, 千, 万)"
   , pattern =
     [ dimension Numeral
-    , regex "(k|m|g|\x5343|\x4e07)"
+    , regex "(k|m|g|千|万)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
        Token RegexMatch (GroupMatch (match:_)):
        _) -> case Text.toLower match of
           "k"      -> double $ v * 1e3
-          "\x5343" -> double $ v * 1e3
-          "\x4e07" -> double $ v * 1e4
+          "千" -> double $ v * 1e3
+          "万" -> double $ v * 1e4
           "m"      -> double $ v * 1e6
           "g"      -> double $ v * 1e9
           _ -> Nothing
@@ -213,7 +192,7 @@
   { name = "integer (200..900)"
   , pattern =
     [ numberBetween 2 10
-    , regex "\x767e"
+    , regex "百"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 100
@@ -224,7 +203,7 @@
 ruleInteger14 = Rule
   { name = "integer (10000..19999)"
   , pattern =
-    [ regex "\x4e07"
+    [ regex "万"
     , numberBetween 1 10000
     ]
   , prod = \tokens -> case tokens of
@@ -265,32 +244,36 @@
 ruleInteger9 = Rule
   { name = "integer (1000)"
   , pattern =
-    [ regex "\x5343"
+    [ regex "千"
     ]
   , prod = \_ -> integer 1000
   }
 
+integerMap :: HashMap Text Integer
+integerMap = HashMap.fromList
+  [ ("零", 0)
+  , ("ゼロ", 0)
+  , ("一", 1)
+  , ("二", 2)
+  , ("三", 3)
+  , ("四", 4)
+  , ("五", 5)
+  , ("六", 6)
+  , ("七", 7)
+  , ("八", 8)
+  , ("九", 9)
+  , ("十", 10)
+  ]
+
 ruleInteger :: Rule
 ruleInteger = Rule
   { name = "integer (0..10)"
   , pattern =
-    [ regex "\x30bc\x30ed|\x96f6|\x4e00|\x4e8c|\x4e09|\x56db|\x4e94|\x516d|\x4e03|\x516b|\x4e5d|\x5341"
+    [ regex "(ゼロ|零|一|二|三|四|五|六|七|八|九|十)"
     ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x96f6" -> integer 0
-        "\x30bc\x30ed" -> integer 0
-        "\x4e00" -> integer 1
-        "\x4e8c" -> integer 2
-        "\x4e09" -> integer 3
-        "\x56db" -> integer 4
-        "\x4e94" -> integer 5
-        "\x516d" -> integer 6
-        "\x4e03" -> integer 7
-        "\x516b" -> integer 8
-        "\x4e5d" -> integer 9
-        "\x5341" -> integer 10
-        _ -> Nothing
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) integerMap >>= integer
       _ -> Nothing
   }
 
@@ -312,7 +295,7 @@
 ruleInteger2 = Rule
   { name = "integer (11..19)"
   , pattern =
-    [ regex "\x5341"
+    [ regex "十"
     , numberBetween 1 10
     ]
   , prod = \tokens -> case tokens of
@@ -325,7 +308,7 @@
   { name = "integer (2000..9000)"
   , pattern =
     [ numberBetween 2 10
-    , regex "\x5343"
+    , regex "千"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 1000
@@ -356,7 +339,6 @@
   , ruleInteger14
   , ruleInteger15
   , ruleInteger16
-  , ruleInteger17
   , ruleInteger2
   , ruleInteger3
   , ruleInteger4
diff --git a/Duckling/Numeral/KA/Corpus.hs b/Duckling/Numeral/KA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/KA/Corpus.hs
@@ -0,0 +1,43 @@
+-- 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.KA.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 KA Nothing}, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "0"
+             , "ნული"
+             ]
+  , examples (NumeralValue 1)
+             [ "1"
+             , "ერთი"
+             ]
+  , examples (NumeralValue 2)
+             [ "2"
+             , "ორი"
+             ]
+  , examples (NumeralValue 3)
+             [ "3"
+             , "სამი"
+             ]
+  ]
diff --git a/Duckling/Numeral/KA/Rules.hs b/Duckling/Numeral/KA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/KA/Rules.hs
@@ -0,0 +1,75 @@
+-- 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.Numeral.KA.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
+
+ruleIntegerNumeric :: Rule
+ruleIntegerNumeric = Rule
+  { name = "integer (numeric)"
+  , pattern =
+    [ regex "(\\d{1,18})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):
+       _) -> do
+         v <- parseInt match
+         integer $ toInteger v
+      _ -> Nothing
+  }
+
+ruleNumeralMap :: HashMap Text Integer
+ruleNumeralMap = HashMap.fromList
+  [ ( "ნული", 0 )
+  , ( "ერთი", 1 )
+  , ( "ორი", 2 )
+  , ( "სამი", 3 )
+  , ( "ოთხი", 4 )
+  , ( "ხუთი", 5)
+  , ( "ექვსი", 6)
+  , ( "შვიდი", 7)
+  , ( "რვა", 8)
+  , ( "ცხრა", 9)
+  , ( "ათი", 10)
+  ]
+
+ruleNumeral :: Rule
+ruleNumeral = Rule
+  { name = "number (0..10)"
+  , pattern =
+    [ regex "(ნული|ერთი|ორი|სამი|ოთხი|ხუთი|ექვსი|შვიდი|რვა|ცხრა|ათი)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) ruleNumeralMap >>= integer
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntegerNumeric
+  , ruleNumeral
+  ]
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, 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
@@ -28,15 +28,15 @@
 ruleIntegerForOrdinals = Rule
   { name = "integer (1..4) - for ordinals"
   , pattern =
-    [ regex "(\xd55c|\xccab|\xb450|\xc138|\xb124)"
+    [ regex "(한|첫|두|세|네)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\xd55c" -> integer 1
-        "\xccab" -> integer 1
-        "\xb450" -> integer 2
-        "\xc138" -> integer 3
-        "\xb124" -> integer 4
+        "한" -> integer 1
+        "첫" -> integer 1
+        "두" -> integer 2
+        "세" -> integer 3
+        "네" -> integer 4
         _ -> Nothing
       _ -> Nothing
   }
@@ -58,7 +58,7 @@
 ruleFew = Rule
   { name = "few 몇"
   , pattern =
-    [ regex "\xba87"
+    [ regex "몇"
     ]
   , prod = \_ -> integer 3
   }
@@ -106,7 +106,7 @@
 ruleNumeralsPrefixWithOr = Rule
   { name = "numbers prefix with -, 마이너스, or 마이나스"
   , pattern =
-    [ regex "-|\xb9c8\xc774\xb108\xc2a4\\s?|\xb9c8\xc774\xb098\xc2a4\\s?"
+    [ regex "-|마이너스\\s?|마이나스\\s?"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -118,7 +118,7 @@
 ruleHalf = Rule
   { name = "half - 반"
   , pattern =
-    [ regex "\xbc18"
+    [ regex "반"
     ]
   , prod = \_ -> double 0.5
   }
@@ -127,7 +127,7 @@
 ruleInteger = Rule
   { name = "integer 0"
   , pattern =
-    [ regex "\xc601|\xacf5|\xbe75"
+    [ regex "영|공|빵"
     ]
   , prod = \_ -> integer 0
   }
@@ -136,19 +136,19 @@
 ruleIntegerTypeAndOrdinals = Rule
   { name = "integer (20..90) - TYPE 2 and ordinals"
   , pattern =
-    [ regex "(\xc5f4|\xc2a4\xbb3c|\xc11c\xb978|\xb9c8\xd754|\xc270|\xc608\xc21c|\xc77c\xd754|\xc5ec\xb4e0|\xc544\xd754)"
+    [ regex "(열|스물|서른|마흔|쉰|예순|일흔|여든|아흔)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\xc5f4" -> integer 10
-        "\xc2a4\xbb3c" -> integer 20
-        "\xc11c\xb978" -> integer 30
-        "\xb9c8\xd754" -> integer 40
-        "\xc270" -> integer 50
-        "\xc608\xc21c" -> integer 60
-        "\xc77c\xd754" -> integer 70
-        "\xc5ec\xb4e0" -> integer 80
-        "\xc544\xd754" -> integer 90
+        "열" -> integer 10
+        "스물" -> integer 20
+        "서른" -> integer 30
+        "마흔" -> integer 40
+        "쉰" -> integer 50
+        "예순" -> integer 60
+        "일흔" -> integer 70
+        "여든" -> integer 80
+        "아흔" -> integer 90
         _ -> Nothing
       _ -> Nothing
   }
@@ -157,20 +157,20 @@
 ruleIntegerType1 = Rule
   { name = "integer - TYPE 1"
   , pattern =
-    [ regex "(\xc601|\xc77c|\xc774|\xc0bc|\xc0ac|\xc624|\xc721|\xce60|\xd314|\xad6c)"
+    [ regex "(영|일|이|삼|사|오|육|칠|팔|구)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\xc601" -> integer 0
-        "\xc77c" -> integer 1
-        "\xc774" -> integer 2
-        "\xc0bc" -> integer 3
-        "\xc0ac" -> integer 4
-        "\xc624" -> integer 5
-        "\xc721" -> integer 6
-        "\xce60" -> integer 7
-        "\xd314" -> integer 8
-        "\xad6c" -> integer 9
+        "영" -> integer 0
+        "일" -> integer 1
+        "이" -> integer 2
+        "삼" -> integer 3
+        "사" -> integer 4
+        "오" -> integer 5
+        "육" -> integer 6
+        "칠" -> integer 7
+        "팔" -> integer 8
+        "구" -> integer 9
         _ -> Nothing
       _ -> Nothing
   }
@@ -179,16 +179,16 @@
 ruleIntegerType1PowersOfTen = Rule
   { name = "integer - TYPE 1: powers of ten"
   , pattern =
-    [ regex "(\xc2ed|\xbc31|\xcc9c|\xb9cc|\xc5b5|\xc870)"
+    [ regex "(십|백|천|만|억|조)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\xc2ed" -> double 10   >>= withGrain 1  >>= withMultipliable
-        "\xbc31" -> double 1e2  >>= withGrain 2  >>= withMultipliable
-        "\xcc9c" -> double 1e3  >>= withGrain 3  >>= withMultipliable
-        "\xb9cc" -> double 1e4  >>= withGrain 4  >>= withMultipliable
-        "\xc5b5" -> double 1e8  >>= withGrain 8  >>= withMultipliable
-        "\xc870" -> double 1e12 >>= withGrain 12 >>= withMultipliable
+        "십" -> double 10   >>= withGrain 1  >>= withMultipliable
+        "백" -> double 1e2  >>= withGrain 2  >>= withMultipliable
+        "천" -> double 1e3  >>= withGrain 3  >>= withMultipliable
+        "만" -> double 1e4  >>= withGrain 4  >>= withMultipliable
+        "억" -> double 1e8  >>= withGrain 8  >>= withMultipliable
+        "조" -> double 1e12 >>= withGrain 12 >>= withMultipliable
         _ -> Nothing
       _ -> Nothing
   }
@@ -224,19 +224,19 @@
 ruleIntegerType2 = Rule
   { name = "integer (1..10) - TYPE 2"
   , pattern =
-    [ regex "(\xd558\xb098|\xb458|\xc14b|\xb137|\xb2e4\xc12f|\xc5ec\xc12f|\xc77c\xacf1|\xc5ec\xb35f|\xc544\xd649)"
+    [ regex "(하나|둘|셋|넷|다섯|여섯|일곱|여덟|아홉)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\xd558\xb098" -> integer 1
-        "\xb458" -> integer 2
-        "\xc14b" -> integer 3
-        "\xb137" -> integer 4
-        "\xb2e4\xc12f" -> integer 5
-        "\xc5ec\xc12f" -> integer 6
-        "\xc77c\xacf1" -> integer 7
-        "\xc5ec\xb35f" -> integer 8
-        "\xc544\xd649" -> integer 9
+        "하나" -> integer 1
+        "둘" -> integer 2
+        "셋" -> integer 3
+        "넷" -> integer 4
+        "다섯" -> integer 5
+        "여섯" -> integer 6
+        "일곱" -> integer 7
+        "여덟" -> integer 8
+        "아홉" -> integer 9
         _ -> Nothing
       _ -> Nothing
   }
@@ -246,7 +246,7 @@
   { name = "fraction"
   , pattern =
     [ dimension Numeral
-    , regex "\xbd84(\xc758|\xc5d0)"
+    , regex "분(의|에)"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -262,22 +262,22 @@
   { name = "number dot number - 삼점사"
   , pattern =
     [ dimension Numeral
-    , regex "(\xc810|\xca5c)((\xc601|\xc77c|\xc774|\xc0bc|\xc0ac|\xc624|\xc721|\xce60|\xd314|\xad6c)+)"
+    , regex "(점|쩜)((영|일|이|삼|사|오|육|칠|팔|구)+)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v1}):
        Token RegexMatch (GroupMatch (_:match:_)):
        _) -> do
-        let getDigit '\xc601' = Just "0"
-            getDigit '\xc77c' = Just "1"
-            getDigit '\xc774' = Just "2"
-            getDigit '\xc0bc' = Just "3"
-            getDigit '\xc0ac' = Just "4"
-            getDigit '\xc624' = Just "5"
-            getDigit '\xc721' = Just "6"
-            getDigit '\xce60' = Just "7"
-            getDigit '\xd314' = Just "8"
-            getDigit '\xad6c' = Just "9"
+        let getDigit '영' = Just "0"
+            getDigit '일' = Just "1"
+            getDigit '이' = Just "2"
+            getDigit '삼' = Just "3"
+            getDigit '사' = Just "4"
+            getDigit '오' = Just "5"
+            getDigit '육' = Just "6"
+            getDigit '칠' = Just "7"
+            getDigit '팔' = Just "8"
+            getDigit '구' = Just "9"
             getDigit _ = Nothing
         v2 <- parseDouble . Text.concat . mapMaybe getDigit $ Text.unpack match
         double $ v1 + decimalsToDouble v2
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = MY}, allExamples)
+corpus = (testContext {locale = makeLocale MY Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/MY/Rules.hs b/Duckling/Numeral/MY/Rules.hs
--- a/Duckling/Numeral/MY/Rules.hs
+++ b/Duckling/Numeral/MY/Rules.hs
@@ -27,7 +27,7 @@
   { name = "integer (11..99) "
   , pattern =
     [ numberBetween 1 10
-    , regex "\x1006\x101a\x103a\x1037"
+    , regex "ဆယ့်"
     , numberBetween 1 10
     ]
   , prod = \tokens -> case tokens of
@@ -42,20 +42,20 @@
 ruleIntegerNumeric = Rule
   { name = "integer (0..9) - numeric"
   , pattern =
-    [ regex "(\x1040|\x1041|\x1042|\x1043|\x1044|\x1045|\x1046|\x1047|\x1048|\x1049)"
+    [ regex "(၀|၁|၂|၃|၄|၅|၆|၇|၈|၉)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x1040" -> integer 0
-        "\x1041" -> integer 1
-        "\x1042" -> integer 2
-        "\x1043" -> integer 3
-        "\x1044" -> integer 4
-        "\x1045" -> integer 5
-        "\x1046" -> integer 6
-        "\x1047" -> integer 7
-        "\x1048" -> integer 8
-        "\x1049" -> integer 9
+        "၀" -> integer 0
+        "၁" -> integer 1
+        "၂" -> integer 2
+        "၃" -> integer 3
+        "၄" -> integer 4
+        "၅" -> integer 5
+        "၆" -> integer 6
+        "၇" -> integer 7
+        "၈" -> integer 8
+        "၉" -> integer 9
         _ -> Nothing
       _ -> Nothing
   }
@@ -64,7 +64,7 @@
 ruleInteger3 = Rule
   { name = "integer (11..19) "
   , pattern =
-    [ regex "\x1006\x101a\x103a\x1037"
+    [ regex "ဆယ့်"
     , numberBetween 1 10
     ]
   , prod = \tokens -> case tokens of
@@ -76,13 +76,13 @@
 ruleIntegerPali = Rule
   { name = "integer (1..3) - pali"
   , pattern =
-    [ regex "(\x1015\x1011\x1019|\x1012\x102f\x1010\x102d\x101a|\x1010\x1010\x102d\x101a)"
+    [ regex "(ပထမ|ဒုတိယ|တတိယ)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x1015\x1011\x1019" -> integer 1
-        "\x1012\x102f\x1010\x102d\x101a" -> integer 2
-        "\x1010\x1010\x102d\x101a" -> integer 3
+        "ပထမ" -> integer 1
+        "ဒုတိယ" -> integer 2
+        "တတိယ" -> integer 3
         _ -> Nothing
       _ -> Nothing
   }
@@ -92,7 +92,7 @@
   { name = "integer (100..900)"
   , pattern =
     [ numberBetween 1 10
-    , regex "\x101b\x102c"
+    , regex "ရာ"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 100
@@ -104,7 +104,7 @@
   { name = "integer (1000..9000)"
   , pattern =
     [ numberBetween 1 10
-    , regex "\x1011\x1031\x102c\x1004\x103a"
+    , regex "ထောင်"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 1000
@@ -116,7 +116,7 @@
   { name = "integer (10000..90000)"
   , pattern =
     [ numberBetween 1 10
-    , regex "\x101e\x1031\x102c\x1004\x103a\x1038"
+    , regex "သောင်း"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 10000
@@ -127,7 +127,7 @@
 ruleInteger = Rule
   { name = "integer 0"
   , pattern =
-    [ regex "\x101e\x102f\x1036\x100a|\x1019\x101b\x103e\x102d"
+    [ regex "သုံည|မရှိ"
     ]
   , prod = \_ -> integer 0
   }
@@ -137,7 +137,7 @@
   { name = "integer (10..90)"
   , pattern =
     [ numberBetween 1 10
-    , regex "\x1006\x101a\x103a"
+    , regex "ဆယ်"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 10
@@ -148,20 +148,20 @@
 ruleInteger2 = Rule
   { name = "integer (1..10)"
   , pattern =
-    [ regex "(\x1010\x1005\x103a|\x1014\x103e\x1005\x103a|\x101e\x102f\x1036\x1038|\x101c\x1031\x1038|\x1004\x102b\x1038|\x1001\x103c\x1031\x102b\x1000\x103a|\x1001\x102f\x1014\x103e\x1005\x103a|\x101b\x103e\x1005\x103a|\x1000\x102d\x102f\x1038|\x1010\x1005\x103a\x1006\x101a\x103a)"
+    [ regex "(တစ်|နှစ်|သုံး|လေး|ငါး|ခြေါက်|ခုနှစ်|ရှစ်|ကိုး|တစ်ဆယ်)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x1010\x1005\x103a" -> integer 1
-        "\x1014\x103e\x1005\x103a" -> integer 2
-        "\x101e\x102f\x1036\x1038" -> integer 3
-        "\x101c\x1031\x1038" -> integer 4
-        "\x1004\x102b\x1038" -> integer 5
-        "\x1001\x103c\x1031\x102b\x1000\x103a" -> integer 6
-        "\x1001\x102f\x1014\x103e\x1005\x103a" -> integer 7
-        "\x101b\x103e\x1005\x103a" -> integer 8
-        "\x1000\x102d\x102f\x1038" -> integer 9
-        "\x1010\x1005\x103a\x1006\x101a\x103a" -> integer 10
+        "တစ်" -> integer 1
+        "နှစ်" -> integer 2
+        "သုံး" -> integer 3
+        "လေး" -> integer 4
+        "ငါး" -> integer 5
+        "ခြေါက်" -> integer 6
+        "ခုနှစ်" -> integer 7
+        "ရှစ်" -> integer 8
+        "ကိုး" -> integer 9
+        "တစ်ဆယ်" -> integer 10
         _ -> Nothing
       _ -> Nothing
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = NB}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, 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
@@ -72,7 +72,7 @@
 ruleFew = Rule
   { name = "few"
   , pattern =
-    [ regex "(noen )?f\x00e5"
+    [ regex "(noen )?få"
     ]
   , prod = \_ -> integer 3
   }
@@ -158,7 +158,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -214,7 +214,7 @@
   , ( "intet" , 0 )
   , ( "en" , 1 )
   , ( "ett" , 1 )
-  , ( "\x00e9n" , 1 )
+  , ( "én" , 1 )
   , ( "to" , 2 )
   , ( "tre" , 3 )
   , ( "fire" , 4 )
@@ -231,7 +231,7 @@
   , ( "fjorten" , 14 )
   , ( "femten" , 15 )
   , ( "seksten" , 16 )
-  , ( "s\x00f8tten" , 17 )
+  , ( "søtten" , 17 )
   , ( "sytten" , 17 )
   , ( "atten" , 18 )
   , ( "nitten" , 19 )
@@ -241,7 +241,7 @@
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(intet|ingen|null|en|ett|\x00e9n|to|tretten|tre|fire|femten|fem|seksten|seks|syv|sju|\x00e5tte|nitten|ni|ti|elleve|tolv|fjorten|sytten|s\x00f8tten|atten)"
+    [ regex "(intet|ingen|null|en|ett|én|to|tretten|tre|fire|femten|fem|seksten|seks|syv|sju|åtte|nitten|ni|ti|elleve|tolv|fjorten|sytten|søtten|atten)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -255,12 +255,12 @@
   , ( "tjue" , 20 )
   , ( "tredve" , 30 )
   , ( "tretti" , 30 )
-  , ( "f\x00f8rti" , 40 )
+  , ( "førti" , 40 )
   , ( "femti" , 50 )
   , ( "seksti" , 60 )
   , ( "sytti" , 70 )
-  , ( "s\x00f8tti" , 70 )
-  , ( "\x00e5tti" , 80 )
+  , ( "søtti" , 70 )
+  , ( "åtti" , 80 )
   , ( "nitti" , 90 )
   ]
 
@@ -268,7 +268,7 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(tyve|tjue|tredve|tretti|f\x00f8rti|femti|seksti|sytti|s\x00f8tti|\x00e5tti|nitti)"
+    [ regex "(tyve|tjue|tredve|tretti|førti|femti|seksti|sytti|søtti|åtti|nitti)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = NL}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -47,6 +47,10 @@
              , "drie en dertig"
              , "0033"
              ]
+  , examples (NumeralValue 12)
+             [ "twaalf"
+             , "dozijn"
+             ]
   , examples (NumeralValue 14)
              [ "14"
              , "veertien"
@@ -79,6 +83,9 @@
   , examples (NumeralValue 5000)
              [ "5 duizend"
              , "vijf duizend"
+             ]
+  , examples (NumeralValue 144)
+             [ "gros"
              ]
   , examples (NumeralValue 122)
              [ "honderd tweeëntwintig"
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
@@ -102,7 +102,7 @@
 ruleInteger3 = Rule
   { name = "integer ([2-9][1-9])"
   , pattern =
-    [ regex "(een|twee|drie|vier|vijf|zes|zeven|acht|negen)(?:e|\x00eb)n(twintig|dertig|veertig|vijftig|zestig|zeventig|tachtig|negentig)"
+    [ regex "(een|twee|drie|vier|vijf|zes|zeven|acht|negen)(?:e|ë)n(twintig|dertig|veertig|vijftig|zestig|zeventig|tachtig|negentig)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
@@ -143,7 +143,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -205,12 +205,21 @@
   , prod = \_ -> integer 12 >>= withGrain 1
   }
 
+ruleGross :: Rule
+ruleGross = Rule
+  { name = "gros"
+  , pattern =
+    [ regex "gros"
+    ]
+  , prod = \_ -> integer 144 >>= withGrain 1
+  }
+
 zeroNineteenMap :: HashMap Text Integer
 zeroNineteenMap = HashMap.fromList
   [ ("niks", 0)
   , ("nul", 0)
   , ("geen", 0)
-  , ("\x00e9\x00e9n", 1)
+  , ("één", 1)
   , ("een", 1)
   , ("twee", 2)
   , ("drie", 3)
@@ -236,7 +245,7 @@
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(geen|nul|niks|een|\x00e9\x00e9n|twee|drie|vier|vijftien|vijf|zestien|zes|zeventien|zeven|achtien|acht|negentien|negen|tien|elf|twaalf|dertien|veertien)"
+    [ regex "(geen|nul|niks|een|één|twee|drie|vier|vijftien|vijf|zestien|zes|zeventien|zeven|achtien|acht|negentien|negen|tien|elf|twaalf|dertien|veertien)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -274,6 +283,7 @@
   , ruleDecimalNumeral
   , ruleDecimalWithThousandsSeparator
   , ruleDozen
+  , ruleGross
   , ruleFew
   , ruleInteger
   , ruleInteger2
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PL}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, 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
@@ -28,7 +28,7 @@
 ruleSixteen = Rule
   { name = "sixteen"
   , pattern =
-    [ regex "szesna(s|\x015b)(tu|cie|toma)"
+    [ regex "szesna(s|ś)(tu|cie|toma)"
     ]
   , prod = \_ -> integer 16
   }
@@ -37,7 +37,7 @@
 ruleFourteen = Rule
   { name = "fourteen"
   , pattern =
-    [ regex "czterna(s|\x015b)(tu|cie|toma)"
+    [ regex "czterna(s|ś)(tu|cie|toma)"
     ]
   , prod = \_ -> integer 14
   }
@@ -46,7 +46,7 @@
 ruleTwo = Rule
   { name = "two"
   , pattern =
-    [ regex "dw(a|(o|\x00f3)(ch|m)|oma|iema|ie)"
+    [ regex "dw(a|(o|ó)(ch|m)|oma|iema|ie)"
     ]
   , prod = \_ -> integer 2
   }
@@ -55,7 +55,7 @@
 ruleSixty = Rule
   { name = "sixty"
   , pattern =
-    [ regex "sze(\x015b\x0107)dziesi(\x0105)t|sze(\x015b\x0107)dziesi(\x0119)ci(u|oma)"
+    [ regex "sze(ść)dziesi(ą)t|sze(ść)dziesi(ę)ci(u|oma)"
     ]
   , prod = \_ -> integer 60
   }
@@ -92,7 +92,7 @@
 ruleOne = Rule
   { name = "one"
   , pattern =
-    [ regex "jed(en|nego|nemu|nym|nej|n(a|\x0105))"
+    [ regex "jed(en|nego|nemu|nym|nej|n(a|ą))"
     ]
   , prod = \_ -> integer 1
   }
@@ -114,7 +114,7 @@
 ruleTen = Rule
   { name = "ten"
   , pattern =
-    [ regex "dzisi(e|\x0119)(\x0107|c)(iu|ioma)?"
+    [ regex "dzisi(e|ę)(ć|c)(iu|ioma)?"
     ]
   , prod = \_ -> integer 10
   }
@@ -149,7 +149,7 @@
 ruleNine = Rule
   { name = "nine"
   , pattern =
-    [ regex "dziewi(e|\x0119)(\x0107|c)(iu|ioma)?"
+    [ regex "dziewi(e|ę)(ć|c)(iu|ioma)?"
     ]
   , prod = \_ -> integer 9
   }
@@ -167,7 +167,7 @@
 ruleTwelve = Rule
   { name = "twelve"
   , pattern =
-    [ regex "dwunast(u|oma)|dwana(\x015b|s)cie"
+    [ regex "dwunast(u|oma)|dwana(ś|s)cie"
     ]
   , prod = \_ -> integer 12
   }
@@ -187,7 +187,7 @@
 ruleFifteen = Rule
   { name = "fifteen"
   , pattern =
-    [ regex "pi(\x0119)tna(s|\x015b)(ta|tu|cie|toma)"
+    [ regex "pi(ę)tna(s|ś)(ta|tu|cie|toma)"
     ]
   , prod = \_ -> integer 15
   }
@@ -196,7 +196,7 @@
 ruleEleven = Rule
   { name = "eleven"
   , pattern =
-    [ regex "jedena(stu|(s|\x015b)cie|stoma)"
+    [ regex "jedena(stu|(s|ś)cie|stoma)"
     ]
   , prod = \_ -> integer 11
   }
@@ -205,7 +205,7 @@
 ruleThirteen = Rule
   { name = "thirteen"
   , pattern =
-    [ regex "trzyna(\x015b|s)(tu|cie|toma)"
+    [ regex "trzyna(ś|s)(tu|cie|toma)"
     ]
   , prod = \_ -> integer 13
   }
@@ -214,7 +214,7 @@
 ruleThirty = Rule
   { name = "thirty"
   , pattern =
-    [ regex "trzydzie(\x015b)ci|trzydziest(u|oma)"
+    [ regex "trzydzie(ś)ci|trzydziest(u|oma)"
     ]
   , prod = \_ -> integer 30
   }
@@ -223,7 +223,7 @@
 ruleNumeral2 = Rule
   { name = "number 200"
   , pattern =
-    [ regex "dwie((\x015b)cie| setki)"
+    [ regex "dwie((ś)cie| setki)"
     ]
   , prod = \_ -> integer 200 >>= withGrain 2
   }
@@ -232,7 +232,7 @@
 ruleSeventeen = Rule
   { name = "seventeen"
   , pattern =
-    [ regex "siedemna(s|\x015b)(tu|cie|toma)"
+    [ regex "siedemna(s|ś)(tu|cie|toma)"
     ]
   , prod = \_ -> integer 17
   }
@@ -250,7 +250,7 @@
 ruleNumeral9 = Rule
   { name = "number 900"
   , pattern =
-    [ regex "dziewi(\x0119\x0107)(set| setek)"
+    [ regex "dziewi(ęć)(set| setek)"
     ]
   , prod = \_ -> integer 900 >>= withGrain 2
   }
@@ -268,7 +268,7 @@
 ruleTwenty = Rule
   { name = "twenty"
   , pattern =
-    [ regex "dwadzie(\x015b|s)cia|dwudziest(u|oma)"
+    [ regex "dwadzie(ś|s)cia|dwudziest(u|oma)"
     ]
   , prod = \_ -> integer 20
   }
@@ -286,7 +286,7 @@
 ruleEight = Rule
   { name = "eight"
   , pattern =
-    [ regex "o(s|\x015b)(iem|miu|mioma)"
+    [ regex "o(s|ś)(iem|miu|mioma)"
     ]
   , prod = \_ -> integer 8
   }
@@ -295,7 +295,7 @@
 ruleNumeral5 = Rule
   { name = "number 500"
   , pattern =
-    [ regex "pi(\x0119\x0107)(set| setek)"
+    [ regex "pi(ęć)(set| setek)"
     ]
   , prod = \_ -> integer 500 >>= withGrain 2
   }
@@ -322,7 +322,7 @@
 ruleThousand = Rule
   { name = "thousand"
   , pattern =
-    [ regex "ty(s|\x015b)i(a|\x0105|\x0119)c(e|y)?"
+    [ regex "ty(s|ś)i(a|ą|ę)c(e|y)?"
     ]
   , prod = \_ -> integer 1000 >>= withGrain 3 >>= withMultipliable
   }
@@ -331,7 +331,7 @@
 ruleMillion = Rule
   { name = "million"
   , pattern =
-    [ regex "milion(y|(\x00f3)w)?"
+    [ regex "milion(y|(ó)w)?"
     ]
   , prod = \_ -> integer 1000000 >>= withGrain 6 >>= withMultipliable
   }
@@ -385,7 +385,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -429,7 +429,7 @@
 ruleSix = Rule
   { name = "six"
   , pattern =
-    [ regex "sze(s|\x015b)(c|\x0107)(iu|oma|u)?"
+    [ regex "sze(s|ś)(c|ć)(iu|oma|u)?"
     ]
   , prod = \_ -> integer 6
   }
@@ -438,7 +438,7 @@
 ruleNumeral6 = Rule
   { name = "number 600"
   , pattern =
-    [ regex "(sze\x015b\x0107(set| setek))"
+    [ regex "(sześć(set| setek))"
     ]
   , prod = \_ -> integer 600 >>= withGrain 2
   }
@@ -456,7 +456,7 @@
 ruleFive = Rule
   { name = "five"
   , pattern =
-    [ regex "pi(e|\x0119)(c|\x0107)(iu|oma|u)?"
+    [ regex "pi(e|ę)(c|ć)(iu|oma|u)?"
     ]
   , prod = \_ -> integer 5
   }
@@ -465,7 +465,7 @@
 ruleFourty = Rule
   { name = "fou?rty"
   , pattern =
-    [ regex "czterdzie(\x015b)ci|czterdziest(u|oma)"
+    [ regex "czterdzie(ś)ci|czterdziest(u|oma)"
     ]
   , prod = \_ -> integer 40
   }
@@ -492,7 +492,7 @@
 ruleNineteen = Rule
   { name = "nineteen"
   , pattern =
-    [ regex "dziewietna(s|\x015b)(tu|cie|toma)"
+    [ regex "dziewietna(s|ś)(tu|cie|toma)"
     ]
   , prod = \_ -> integer 19
   }
@@ -515,7 +515,7 @@
 ruleEighteen = Rule
   { name = "eighteen"
   , pattern =
-    [ regex "osiemna(s|\x015b)(tu|cie|toma)"
+    [ regex "osiemna(s|ś)(tu|cie|toma)"
     ]
   , prod = \_ -> integer 18
   }
@@ -550,7 +550,7 @@
 ruleFifty = Rule
   { name = "fifty"
   , pattern =
-    [ regex "pi(\x0119\x0107)dziesi(\x0105)t|pi(\x0119\x0107)dziesi(\x0119)ci(u|oma)"
+    [ regex "pi(ęć)dziesi(ą)t|pi(ęć)dziesi(ę)ci(u|oma)"
     ]
   , prod = \_ -> integer 50
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, 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
@@ -80,7 +80,7 @@
 ruleNumeral2 = Rule
   { name = "number (20..90)"
   , pattern =
-    [ regex "(vinte|trinta|quarenta|cincoenta|cinq(\x00fc)enta|cinquenta|sessenta|setenta|oitenta|noventa)"
+    [ regex "(vinte|trinta|quarenta|cincoenta|cinq(ü)enta|cinquenta|sessenta|setenta|oitenta|noventa)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -102,7 +102,7 @@
 ruleNumeral = Rule
   { name = "number (0..15)"
   , pattern =
-    [ regex "(zero|uma?|d(oi|ua)s|tr(\x00ea|e)s|quatro|cinco|seis|sete|oito|nove|dez|onze|doze|treze|(ca|qua)torze|quinze)"
+    [ regex "(zero|uma?|d(oi|ua)s|tr(ê|e)s|quatro|cinco|seis|sete|oito|nove|dez|onze|doze|treze|(ca|qua)torze|quinze)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -111,7 +111,7 @@
         "um" -> integer 1
         "dois" -> integer 2
         "duas" -> integer 2
-        "tr\x00eas" -> integer 3
+        "três" -> integer 3
         "tres" -> integer 3
         "quatro" -> integer 4
         "cinco" -> integer 5
@@ -167,7 +167,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -224,7 +224,7 @@
 ruleDozen = Rule
   { name = "dozen"
   , pattern =
-    [ regex "d(\x00fa|u)zias?"
+    [ regex "d(ú|u)zias?"
     ]
   , prod = \_ -> integer 12 >>= withGrain 1 >>= withMultipliable
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, 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
@@ -138,7 +138,7 @@
   { name = "intersect (cu și)"
   , pattern =
     [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
-    , regex "(s|\x0219)i"
+    , regex "(s|ș)i"
     , numberWith TNumeral.multipliable not
     ]
   , prod = \tokens -> case tokens of
@@ -166,13 +166,13 @@
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(sut(a|e|\x0103)?|milio(n|ane)?|miliar(de?)?|mi[ei]?)"
+    [ regex "(sut(a|e|ă)?|milio(n|ane)?|miliar(de?)?|mi[ei]?)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "suta"      -> double 1e2 >>= withGrain 2 >>= withMultipliable
         "sute"      -> double 1e2 >>= withGrain 2 >>= withMultipliable
-        "sut\x0103" -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "sută" -> double 1e2 >>= withGrain 2 >>= withMultipliable
         "mi"        -> double 1e3 >>= withGrain 3 >>= withMultipliable
         "mie"       -> double 1e3 >>= withGrain 3 >>= withMultipliable
         "mii"       -> double 1e3 >>= withGrain 3 >>= withMultipliable
@@ -200,13 +200,13 @@
   , ("unu", 1)
   , ("unul", 1)
   , ("intai", 1)
-  , ("\x00eentai", 1)
-  , ("int\x00e2i", 1)
-  , ("\x00eent\x00e2i", 1)
+  , ("întai", 1)
+  , ("intâi", 1)
+  , ("întâi", 1)
   , ("o", 1)
   , ("doi", 2)
   , ("doua", 2)
-  , ("dou\x0103", 2)
+  , ("două", 2)
   , ("trei", 3)
   , ("patru", 4)
   , ("cinci", 5)
@@ -216,7 +216,7 @@
   , ("\537apte", 7)
   , ("opt", 8)
   , ("noua", 9)
-  , ("nou\x0103", 9)
+  , ("nouă", 9)
   , ("zece", 10)
   , ("zeci", 10)
   ]
@@ -225,7 +225,7 @@
 ruleIntegerZeroTen = Rule
   { name = "integer (0..10)"
   , pattern =
-    [ regex "(zero|nimic|nici(\\s?o|\\sun(a|ul?))|una|unul?|doi|dou(a|\x0103)|trei|patru|cinci|(s|\x0219)ase|(s|\x0219)apte|opt|nou(a|\x0103)|zec[ei]|(i|\x00ee)nt(a|\x00e2)i|un|o)"
+    [ regex "(zero|nimic|nici(\\s?o|\\sun(a|ul?))|una|unul?|doi|dou(a|ă)|trei|patru|cinci|(s|ș)ase|(s|ș)apte|opt|nou(a|ă)|zec[ei]|(i|î)nt(a|â)i|un|o)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -250,14 +250,14 @@
   , ("opti", 18)
   , ("opt", 18)
   , ("noua", 19)
-  , ("nou\x0103", 19)
+  , ("nouă", 19)
   ]
 
 ruleInteger :: Rule
 ruleInteger = Rule
   { name = "integer (11..19)"
   , pattern =
-    [ regex "(cin|sapti|opti)(s|\x0219)pe|(cinci|(s|\x0219)apte|opt)sprezece|(un|doi|trei|pai|(s|\x0219)ai|nou(a|\x0103))((s|\x0219)pe|sprezece)"
+    [ regex "(cin|sapti|opti)(s|ș)pe|(cinci|(s|ș)apte|opt)sprezece|(un|doi|trei|pai|(s|ș)ai|nou(a|ă))((s|ș)pe|sprezece)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (e1:_:e2:_:r:_)):_) -> do
@@ -274,7 +274,7 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(dou(a|\x0103)|trei|patru|cinci|(s|\x0219)ai|(s|\x0219)apte|opt|nou(a|\x0103))\\s?zeci"
+    [ regex "(dou(a|ă)|trei|patru|cinci|(s|ș)ai|(s|ș)apte|opt|nou(a|ă))\\s?zeci"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RU}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, 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
@@ -29,21 +29,21 @@
 
 dozensMap :: HashMap Text Integer
 dozensMap = HashMap.fromList
-  [ ( "\x0434\x0432\x0430\x0434\x0446\x0430\x0442\x044c", 20)
-  , ( "\x0442\x0440\x0438\x0434\x0446\x0430\x0442\x044c", 30)
-  , ( "\x0441\x043e\x0440\x043e\x043a", 40)
-  , ( "\x043f\x044f\x0442\x044c\x0434\x0435\x0441\x044f\x0442", 50)
-  , ( "\x0448\x0435\x0441\x0442\x044c\x0434\x0435\x0441\x044f\x0442", 60)
-  , ( "\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442", 70)
-  , ( "\x0432\x043e\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442", 80)
-  , ( "\x0434\x0435\x0432\x044f\x043d\x043e\x0441\x0442\x043e", 90)
+  [ ( "двадцать", 20)
+  , ( "тридцать", 30)
+  , ( "сорок", 40)
+  , ( "пятьдесят", 50)
+  , ( "шестьдесят", 60)
+  , ( "семьдесят", 70)
+  , ( "восемьдесят", 80)
+  , ( "девяносто", 90)
   ]
 
 ruleInteger5 :: Rule
 ruleInteger5 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(\x0434\x0432\x0430\x0434\x0446\x0430\x0442\x044c|\x0442\x0440\x0438\x0434\x0446\x0430\x0442\x044c|\x0441\x043e\x0440\x043e\x043a|\x043f\x044f\x0442\x044c\x0434\x0435\x0441\x044f\x0442|\x0448\x0435\x0441\x0442\x044c\x0434\x0435\x0441\x044f\x0442|\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442|\x0432\x043e\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442|\x0434\x0435\x0432\x044f\x043d\x043e\x0441\x0442\x043e)"
+    [ regex "(двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -91,29 +91,29 @@
 ruleInteger3 = Rule
   { name = "integer 2"
   , pattern =
-    [ regex "(\x0434\x0432\x0430|\x0434\x0432\x0435|\x0434\x0432\x043e\x0435|\x043f\x0430\x0440\x0430|\x043f\x0430\x0440\x0443|\x043f\x0430\x0440\x043e\x0447\x043a\x0443|\x043f\x0430\x0440\x043e\x0447\x043a\x0430)"
+    [ regex "(два|две|двое|пара|пару|парочку|парочка)"
     ]
   , prod = \_ -> integer 2
   }
 
 hundredsMap :: HashMap Text Integer
 hundredsMap = HashMap.fromList
-  [ ( "\x0441\x0442\x043e", 100)
-  , ( "\x0434\x0432\x0435\x0441\x0442\x0438", 200)
-  , ( "\x0442\x0440\x0438\x0441\x0442\x043e", 300)
-  , ( "\x0447\x0435\x0442\x044b\x0440\x0435\x0441\x0442\x043e", 400)
-  , ( "\x043f\x044f\x0442\x044c\x0441\x043e\x0442", 500)
-  , ( "\x0448\x0435\x0441\x0442\x044c\x0441\x043e\x0442", 600)
-  , ( "\x0441\x0435\x043c\x044c\x0441\x043e\x0442", 700)
-  , ( "\x0432\x043e\x0441\x0435\x043c\x044c\x0441\x043e\x0442", 800)
-  , ( "\x0434\x0435\x0432\x044f\x0442\x044c\x0441\x043e\x0442", 900)
+  [ ( "сто", 100)
+  , ( "двести", 200)
+  , ( "тристо", 300)
+  , ( "четыресто", 400)
+  , ( "пятьсот", 500)
+  , ( "шестьсот", 600)
+  , ( "семьсот", 700)
+  , ( "восемьсот", 800)
+  , ( "девятьсот", 900)
   ]
 
 ruleInteger6 :: Rule
 ruleInteger6 = Rule
   { name = "integer (100..900)"
   , pattern =
-    [ regex "(\x0441\x0442\x043e|\x0434\x0432\x0435\x0441\x0442\x0438|\x0442\x0440\x0438\x0441\x0442\x043e|\x0447\x0435\x0442\x044b\x0440\x0435\x0441\x0442\x043e|\x043f\x044f\x0442\x044c\x0441\x043e\x0442|\x0448\x0435\x0441\x0442\x044c\x0441\x043e\x0442|\x0441\x0435\x043c\x044c\x0441\x043e\x0442|\x0432\x043e\x0441\x0435\x043c\x044c\x0441\x043e\x0442|\x0434\x0435\x0432\x044f\x0442\x044c\x0441\x043e\x0442)"
+    [ regex "(сто|двести|тристо|четыресто|пятьсот|шестьсот|семьсот|восемьсот|девятьсот)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -125,7 +125,7 @@
 ruleNumeralsPrefixWithMinus = Rule
   { name = "numbers prefix with -, minus"
   , pattern =
-    [ regex "-|\x043c\x0438\x043d\x0443\x0441\\s?"
+    [ regex "-|минус\\s?"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -138,18 +138,18 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "((\x043a|\x043c|\x0433)|(\x041a|\x041c|\x0413))(?=[\\W\\$\x20ac]|$)"
+    , regex "((к|м|г)|(К|М|Г))(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
        Token RegexMatch (GroupMatch (match:_)):
        _) -> case Text.toLower match of
-         "\x043a" -> double $ v * 1e3
-         "\x041a" -> double $ v * 1e3
-         "\x043c" -> double $ v * 1e6
-         "\x041c" -> double $ v * 1e6
-         "\x0433" -> double $ v * 1e9
-         "\x0413" -> double $ v * 1e9
+         "к" -> double $ v * 1e3
+         "К" -> double $ v * 1e3
+         "м" -> double $ v * 1e6
+         "М" -> double $ v * 1e6
+         "г" -> double $ v * 1e9
+         "Г" -> double $ v * 1e9
          _   -> Nothing
       _ -> Nothing
   }
@@ -186,37 +186,37 @@
 ruleInteger = Rule
   { name = "integer 0"
   , pattern =
-    [ regex "(\x043d\x043e\x043b\x044c)"
+    [ regex "(ноль)"
     ]
   , prod = \_ -> integer 0
   }
 
 threeToNineteenMap:: HashMap Text Integer
 threeToNineteenMap = HashMap.fromList
-  [ ( "\x0442\x0440\x0438", 3)
-  , ( "\x0447\x0435\x0442\x044b\x0440\x0435", 4)
-  , ( "\x043f\x044f\x0442\x044c", 5)
-  , ( "\x0448\x0435\x0441\x0442\x044c", 6)
-  , ( "\x0441\x0435\x043c\x044c", 7)
-  , ( "\x0432\x043e\x0441\x0435\x043c\x044c", 8)
-  , ( "\x0434\x0435\x0432\x044f\x0442\x044c", 9)
-  , ( "\x0434\x0435\x0441\x044f\x0442\x044c", 10)
-  , ( "\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 11)
-  , ( "\x0434\x0432\x0435\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 12)
-  , ( "\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 13)
-  , ( "\x0447\x0435\x0442\x044b\x0440\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 14)
-  , ( "\x043f\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 15)
-  , ( "\x0448\x0435\x0441\x0442\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 16)
-  , ( "\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 17)
-  , ( "\x0432\x043e\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 18)
-  , ( "\x0434\x0435\x0432\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442\x044c", 19)
+  [ ( "три", 3)
+  , ( "четыре", 4)
+  , ( "пять", 5)
+  , ( "шесть", 6)
+  , ( "семь", 7)
+  , ( "восемь", 8)
+  , ( "девять", 9)
+  , ( "десять", 10)
+  , ( "одинадцать", 11)
+  , ( "двенадцать", 12)
+  , ( "тринадцать", 13)
+  , ( "четырнадцать", 14)
+  , ( "пятнадцать", 15)
+  , ( "шестнадцать", 16)
+  , ( "семнадцать", 17)
+  , ( "восемнадцать", 18)
+  , ( "девятнадцать", 19)
   ]
 
 ruleInteger4 :: Rule
 ruleInteger4 = Rule
   { name = "integer (3..19)"
   , pattern =
-    [ regex "(\x0442\x0440\x0438|\x0447\x0435\x0442\x044b\x0440\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x0447\x0435\x0442\x044b\x0440\x0435|\x043f\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x043f\x044f\x0442\x044c|\x0448\x0435\x0441\x0442\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x0448\x0435\x0441\x0442\x044c|\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x0441\x0435\x043c\x044c|\x0432\x043e\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x0432\x043e\x0441\x0435\x043c\x044c|\x0434\x0435\x0432\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x0434\x0435\x0432\x044f\x0442\x044c|\x0434\x0435\x0441\x044f\x0442\x044c|\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x0434\x0432\x0435\x043d\x0430\x0434\x0446\x0430\x0442\x044c|\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x0430\x0442\x044c)"
+    [ regex "(три|четырнадцать|четыре|пятнадцать|пять|шестнадцать|шесть|семнадцать|семь|восемнадцать|восемь|девятнадцать|девять|десять|одинадцать|двенадцать|тринадцать)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -228,7 +228,7 @@
 ruleInteger2 = Rule
   { name = "integer 1"
   , pattern =
-    [ regex "(\x043e\x0434\x0438\x043d|\x043e\x0434\x043d\x0430|\x043e\x0434\x043d\x0443)"
+    [ regex "(один|одна|одну)"
     ]
   , prod = \_ -> integer 1
   }
@@ -238,7 +238,7 @@
   { name = "number dot number"
   , pattern =
     [ dimension Numeral
-    , regex "\x0442\x043e\x0447\x043a\x0430"
+    , regex "точка"
     , numberWith TNumeral.grain isNothing
     ]
   , prod = \tokens -> case tokens of
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = SV}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, 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
@@ -75,7 +75,7 @@
 ruleFew = Rule
   { name = "few"
   , pattern =
-    [ regex "(n\x00e5gra )?f\x00e5"
+    [ regex "(några )?få"
     ]
   , prod = \_ -> integer 3
   }
@@ -161,7 +161,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -217,13 +217,13 @@
   , ( "noll"     , 0 )
   , ( "en"       , 1 )
   , ( "ett"      , 1 )
-  , ( "tv\x00e5" , 2 )
+  , ( "två" , 2 )
   , ( "tre"      , 3 )
   , ( "fyra"     , 4 )
   , ( "fem"      , 5 )
   , ( "sex"      , 6 )
   , ( "sju"      , 7 )
-  , ( "\x00e5tta", 8 )
+  , ( "åtta", 8 )
   , ( "nio"      , 9 )
   , ( "tio"      , 10 )
   , ( "elva"     , 11 )
@@ -241,7 +241,7 @@
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(inget|ingen|noll|en|ett|tv\x00e5|tretton|tre|fyra|femton|fem|sexton|sex|sjutton|sju|\x00e5tta|nio|tio|elva|tolv|fjorton|arton|nitton)"
+    [ regex "(inget|ingen|noll|en|ett|två|tretton|tre|fyra|femton|fem|sexton|sex|sjutton|sju|åtta|nio|tio|elva|tolv|fjorton|arton|nitton)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -257,7 +257,7 @@
   , ( "femtio"     , 50)
   , ( "sextio"     , 60)
   , ( "sjuttio"    , 70)
-  , ( "\x00e5ttio" , 80)
+  , ( "åttio" , 80)
   , ( "nittio"     , 90)
   ]
 
@@ -265,7 +265,7 @@
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(tjugo|trettio|fyrtio|femtio|sextio|sjuttio|\x00e5ttio|nittio)"
+    [ regex "(tjugo|trettio|fyrtio|femtio|sextio|sjuttio|åttio|nittio)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = TR}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, 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
@@ -29,15 +29,15 @@
 
 hundredsMap :: HashMap Text Integer
 hundredsMap = HashMap.fromList
-  [ ( "y\x00fcz", 100)
-  , ( "ikiy\x00fcz", 200)
-  , ( "\x00fc\x00e7y\x00fcz", 300)
-  , ( "d\x00f6rty\x00fcz", 400)
-  , ( "be\x015fy\x00fcz", 500)
-  , ( "alt\x0131y\x00fcz", 600)
-  , ( "yediy\x00fcz", 700)
-  , ( "sekizy\x00fcz", 800)
-  , ( "dokuzy\x00fcz", 900)
+  [ ( "yüz", 100)
+  , ( "ikiyüz", 200)
+  , ( "üçyüz", 300)
+  , ( "dörtyüz", 400)
+  , ( "beşyüz", 500)
+  , ( "altıyüz", 600)
+  , ( "yediyüz", 700)
+  , ( "sekizyüz", 800)
+  , ( "dokuzyüz", 900)
   ]
 
 
@@ -45,7 +45,7 @@
 ruleInteger5 = Rule
   { name = "integer 100..900"
   , pattern =
-    [ regex "(y\x00fcz|ikiy\x00fcz|\x00fc\x00e7y\x00fcz|d\x00f6rty\x00fcz|be\x015fy\x00fcz|alt\x0131y\x00fcz|yediy\x00fcz|sekizy\x00fcz|dokuzy\x00fcz)"
+    [ regex "(yüz|ikiyüz|üçyüz|dörtyüz|beşyüz|altıyüz|yediyüz|sekizyüz|dokuzyüz)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -83,7 +83,7 @@
 ruleACoupleOf = Rule
   { name = "a couple (of)"
   , pattern =
-    [ regex "(bir )?\x00e7ift"
+    [ regex "(bir )?çift"
     ]
   , prod = \_ -> integer 2 >>= withGrain 1
   }
@@ -151,23 +151,23 @@
 
 numeralSuffixesHalfsuffixTextMap :: HashMap Text Double
 numeralSuffixesHalfsuffixTextMap = HashMap.fromList
-  [ ( "birbu\x00e7uk", 1.5)
-  , ( "bibu\x00e7uk", 1.5)
-  , ( "ikibu\x00e7uk", 2.5)
-  , ( "\x00fc\231bu\x00e7uk", 3.5)
-  , ( "d\x00f6rtbu\x00e7uk", 4.5)
-  , ( "be\351bu\x00e7uk", 5.5)
-  , ( "alt\x0131bu\x00e7uk", 6.5)
-  , ( "yedibu\x00e7uk", 7.5)
-  , ( "sekizbu\x00e7uk", 8.5)
-  , ( "dokuzbu\x00e7uk", 9.5)
+  [ ( "birbuçuk", 1.5)
+  , ( "bibuçuk", 1.5)
+  , ( "ikibuçuk", 2.5)
+  , ( "ü\231buçuk", 3.5)
+  , ( "dörtbuçuk", 4.5)
+  , ( "be\351buçuk", 5.5)
+  , ( "altıbuçuk", 6.5)
+  , ( "yedibuçuk", 7.5)
+  , ( "sekizbuçuk", 8.5)
+  , ( "dokuzbuçuk", 9.5)
   ]
 
 ruleNumeralSuffixesHalfsuffixText :: Rule
 ruleNumeralSuffixesHalfsuffixText = Rule
   { name = "number suffixes (half-suffix text) (1..9)"
   , pattern =
-    [ regex "((bir?|iki|\x00fc\x00e7|d\x00f6rt|be\x015f|alt\x0131|yedi|sekiz|dokuz)(bu\x00e7uk))"
+    [ regex "((bir?|iki|üç|dört|beş|altı|yedi|sekiz|dokuz)(buçuk))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -180,98 +180,98 @@
   [ ( "onbi", 11)
   , ( "onbir", 11)
   , ( "oniki", 12)
-  , ( "on\x00fc\x00e7", 13)
-  , ( "ond\x00f6rt", 14)
-  , ( "onbe\x015f", 15)
-  , ( "onalt\x0131", 16)
+  , ( "onüç", 13)
+  , ( "ondört", 14)
+  , ( "onbeş", 15)
+  , ( "onaltı", 16)
   , ( "onyedi", 17)
   , ( "onsekiz", 18)
   , ( "ondokuz", 19)
   , ( "yirmibi", 21)
   , ( "yirmibir", 21)
   , ( "yirmiiki", 22)
-  , ( "yirmi\x00fc\x00e7", 23)
-  , ( "yirmid\x00f6rt", 24)
-  , ( "yirmibe\x015f", 25)
-  , ( "yirmialt\x0131", 26)
+  , ( "yirmiüç", 23)
+  , ( "yirmidört", 24)
+  , ( "yirmibeş", 25)
+  , ( "yirmialtı", 26)
   , ( "yirmiyedi", 27)
   , ( "yirmisekiz", 28)
   , ( "yirmidokuz", 29)
   , ( "otuzbi", 31)
   , ( "otuzbir", 31)
   , ( "otuziki", 32)
-  , ( "otuz\x00fc\x00e7", 33)
-  , ( "otuzd\x00f6rt", 34)
-  , ( "otuzbe\x015f", 35)
-  , ( "otuzalt\x0131", 36)
+  , ( "otuzüç", 33)
+  , ( "otuzdört", 34)
+  , ( "otuzbeş", 35)
+  , ( "otuzaltı", 36)
   , ( "otuzyedi", 37)
   , ( "otuzsekiz", 38)
   , ( "otuzdokuz", 39)
-  , ( "k\x0131rkbir", 41)
-  , ( "k\x0131rkbi", 41)
-  , ( "k\x0131rkiki", 42)
-  , ( "k\x0131rk\x00fc\x00e7", 43)
-  , ( "k\x0131rkd\x00f6rt", 44)
-  , ( "k\x0131rkbe\x015f", 45)
-  , ( "k\x0131rkalt\x0131", 46)
-  , ( "k\x0131rkyedi", 47)
-  , ( "k\x0131rksekiz", 48)
-  , ( "k\x0131rkdokuz", 49)
+  , ( "kırkbir", 41)
+  , ( "kırkbi", 41)
+  , ( "kırkiki", 42)
+  , ( "kırküç", 43)
+  , ( "kırkdört", 44)
+  , ( "kırkbeş", 45)
+  , ( "kırkaltı", 46)
+  , ( "kırkyedi", 47)
+  , ( "kırksekiz", 48)
+  , ( "kırkdokuz", 49)
   , ( "ellibi", 51)
   , ( "ellibir", 51)
   , ( "elliiki", 52)
-  , ( "elli\x00fc\x00e7", 53)
-  , ( "ellid\x00f6rt", 54)
-  , ( "ellibe\x015f", 55)
-  , ( "ellialt\x0131", 56)
+  , ( "elliüç", 53)
+  , ( "ellidört", 54)
+  , ( "ellibeş", 55)
+  , ( "ellialtı", 56)
   , ( "elliyedi", 57)
   , ( "ellisekiz", 58)
   , ( "ellidokuz", 59)
-  , ( "altm\x0131\x015fbir", 61)
-  , ( "atm\x0131\x015fbir", 61)
-  , ( "atm\x0131\x015fiki", 62)
-  , ( "altm\x0131\x015fiki", 62)
-  , ( "atm\x0131\x015f\x00fc\x00e7", 63)
-  , ( "altm\x0131\x015f\x00fc\x00e7", 63)
-  , ( "atm\x0131\x015fd\x00f6rt", 64)
-  , ( "altm\x0131\x015fd\x00f6rt", 64)
-  , ( "atm\x0131\x015fbe\x015f", 65)
-  , ( "altm\x0131\x015fbe\x015f", 65)
-  , ( "atm\x0131\x015falt\x0131", 66)
-  , ( "altm\x0131\x015falt\x0131", 66)
-  , ( "altm\x0131\x015fyedi", 67)
-  , ( "atm\x0131\x015fyedi", 67)
-  , ( "altm\x0131\x015fsekiz", 68)
-  , ( "atm\x0131\x015fsekiz", 68)
-  , ( "atm\x0131\x015fdokuz", 69)
-  , ( "altm\x0131\x015fdokuz", 69)
-  , ( "yetmi\x015fbir", 71)
-  , ( "yetmi\x015fbi", 71)
-  , ( "yetmi\x015fiki", 72)
-  , ( "yetmi\x015f\x00fc\x00e7", 73)
-  , ( "yetmi\x015fd\x00f6rt", 74)
-  , ( "yetmi\x015fbe\x015f", 75)
-  , ( "yetmi\x015falt\x0131", 76)
-  , ( "yetmi\x015fyedi", 77)
-  , ( "yetmi\x015fsekiz", 78)
-  , ( "yetmi\x015fdokuz", 79)
+  , ( "altmışbir", 61)
+  , ( "atmışbir", 61)
+  , ( "atmışiki", 62)
+  , ( "altmışiki", 62)
+  , ( "atmışüç", 63)
+  , ( "altmışüç", 63)
+  , ( "atmışdört", 64)
+  , ( "altmışdört", 64)
+  , ( "atmışbeş", 65)
+  , ( "altmışbeş", 65)
+  , ( "atmışaltı", 66)
+  , ( "altmışaltı", 66)
+  , ( "altmışyedi", 67)
+  , ( "atmışyedi", 67)
+  , ( "altmışsekiz", 68)
+  , ( "atmışsekiz", 68)
+  , ( "atmışdokuz", 69)
+  , ( "altmışdokuz", 69)
+  , ( "yetmişbir", 71)
+  , ( "yetmişbi", 71)
+  , ( "yetmişiki", 72)
+  , ( "yetmişüç", 73)
+  , ( "yetmişdört", 74)
+  , ( "yetmişbeş", 75)
+  , ( "yetmişaltı", 76)
+  , ( "yetmişyedi", 77)
+  , ( "yetmişsekiz", 78)
+  , ( "yetmişdokuz", 79)
   , ( "seksenbir", 81)
   , ( "seksenbi", 81)
   , ( "sekseniki", 82)
-  , ( "seksen\x00fc\x00e7", 83)
-  , ( "seksend\x00f6rt", 84)
-  , ( "seksenbe\x015f", 85)
-  , ( "seksenalt\x0131", 86)
+  , ( "seksenüç", 83)
+  , ( "seksendört", 84)
+  , ( "seksenbeş", 85)
+  , ( "seksenaltı", 86)
   , ( "seksenyedi", 87)
   , ( "seksensekiz", 88)
   , ( "seksendokuz", 89)
   , ( "doksanbi", 91)
   , ( "doksanbir", 91)
   , ( "doksaniki", 92)
-  , ( "doksan\x00fc\x00e7", 93)
-  , ( "doksand\x00f6rt", 94)
-  , ( "doksanbe\x015f", 95)
-  , ( "doksanalt\x0131", 96)
+  , ( "doksanüç", 93)
+  , ( "doksandört", 94)
+  , ( "doksanbeş", 95)
+  , ( "doksanaltı", 96)
   , ( "doksanyedi", 97)
   , ( "doksansekiz", 98)
   , ( "doksandokuz", 99)
@@ -281,7 +281,7 @@
 ruleInteger3 = Rule
   { name = "integer 11..19 21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99"
   , pattern =
-    [ regex "((on|yirmi|otuz|k\x0131rk|elli|atm\x0131\x015f|altm\x0131\x015f|yetmi\x015f|seksen|doksan)(bir|bi|iki|\x00fc\x00e7|d\x00f6rt|be\x015f|alt\x0131|yedi|sekiz|dokuz))"
+    [ regex "((on|yirmi|otuz|kırk|elli|atmış|altmış|yetmiş|seksen|doksan)(bir|bi|iki|üç|dört|beş|altı|yedi|sekiz|dokuz))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -294,10 +294,10 @@
 thousandsMap = HashMap.fromList
   [ ( "bin", 1000)
   , ( "ikibin", 2000)
-  , ( "\x00fc\x00e7bin", 3000)
-  , ( "d\x00f6rtbin", 4000)
-  , ( "be\x015fbin", 5000)
-  , ( "alt\x0131bin", 6000)
+  , ( "üçbin", 3000)
+  , ( "dörtbin", 4000)
+  , ( "beşbin", 5000)
+  , ( "altıbin", 6000)
   , ( "yedibin", 7000)
   , ( "sekizbin", 8000)
   , ( "dokuzbin", 9000)
@@ -307,7 +307,7 @@
 ruleInteger6 = Rule
   { name = "integer 1000..9000"
   , pattern =
-    [ regex "(bin|ikibin|\x00fc\x00e7bin|d\x00f6rtbin|be\x015fbin|alt\x0131bin|yedibin|sekizbin|dokuzbin)"
+    [ regex "(bin|ikibin|üçbin|dörtbin|beşbin|altıbin|yedibin|sekizbin|dokuzbin)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -334,7 +334,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmgb])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmgb])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -352,11 +352,11 @@
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(y(\x00fc)z|bin|milyon)"
+    [ regex "(y(ü)z|bin|milyon)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "y\x00fcz" -> double 1e2 >>= withGrain 2 >>= withMultipliable
+        "yüz" -> double 1e2 >>= withGrain 2 >>= withMultipliable
         "bin"      -> double 1e3 >>= withGrain 3 >>= withMultipliable
         "milyon"   -> double 1e6 >>= withGrain 6 >>= withMultipliable
         _          -> Nothing
@@ -368,11 +368,11 @@
   [  ( "onbin", 10000)
    , ( "yirmibin", 20000)
    , ( "otuzbin", 30000)
-   , ( "k\x0131rkbin", 40000)
+   , ( "kırkbin", 40000)
    , ( "ellibin", 50000)
-   , ( "altm\x0131\x015fbin", 60000)
-   , ( "atm\x0131\x015fbin", 60000)
-   , ( "yetmi\x015fbin", 70000)
+   , ( "altmışbin", 60000)
+   , ( "atmışbin", 60000)
+   , ( "yetmişbin", 70000)
    , ( "seksenbin", 80000)
    , ( "doksanbin", 90000)
   ]
@@ -381,7 +381,7 @@
 ruleInteger7 = Rule
   { name = "integer 10000..90000"
   , pattern =
-    [ regex "(onbin|yirmibin|otuzbin|k\x0131rkbin|ellibin|atm\x0131\x015fbin|altm\x0131\x015fbin|yetmi\x015fbin|seksenbin|doksanbin)"
+    [ regex "(onbin|yirmibin|otuzbin|kırkbin|ellibin|atmışbin|altmışbin|yetmişbin|seksenbin|doksanbin)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -391,22 +391,22 @@
 
 hundredThousandsMap :: HashMap Text Integer
 hundredThousandsMap = HashMap.fromList
-  [ ( "y\x00fczbin", 100000)
-  , ( "ikiy\x00fczbin", 200000)
-  , ( "\x00fc\x00e7y\x00fczbin", 300000)
-  , ( "d\x00f6rty\x00fczbin", 400000)
-  , ( "be\x015fy\x00fczbin", 500000)
-  , ( "alt\x0131y\x00fczbin", 600000)
-  , ( "yediy\x00fczbin", 700000)
-  , ( "sekizy\x00fczbin", 800000)
-  , ( "dokuzy\x00fczbin", 900000)
+  [ ( "yüzbin", 100000)
+  , ( "ikiyüzbin", 200000)
+  , ( "üçyüzbin", 300000)
+  , ( "dörtyüzbin", 400000)
+  , ( "beşyüzbin", 500000)
+  , ( "altıyüzbin", 600000)
+  , ( "yediyüzbin", 700000)
+  , ( "sekizyüzbin", 800000)
+  , ( "dokuzyüzbin", 900000)
   ]
 
 ruleInteger8 :: Rule
 ruleInteger8 = Rule
   { name = "integer 100000..900000"
   , pattern =
-    [ regex "(y\x00fczbin|ikiy\x00fczbin|\x00fc\x00e7y\x00fczbin|d\x00f6rty\x00fczbin|be\x015fy\x00fczbin|alt\x0131y\x00fczbin|yediy\x00fczbin|sekizy\x00fczbin|dokuzy\x00fczbin)"
+    [ regex "(yüzbin|ikiyüzbin|üçyüzbin|dörtyüzbin|beşyüzbin|altıyüzbin|yediyüzbin|sekizyüzbin|dokuzyüzbin)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -418,118 +418,118 @@
 ruleHalf = Rule
   { name = "half"
   , pattern =
-    [ regex "(yar\x0131m)"
+    [ regex "(yarım)"
     ]
   , prod = \_ -> double 0.5
   }
 
 integer9Map :: HashMap Text Double
 integer9Map = HashMap.fromList
-  [ ( "onbirbu\x00e7uk", 11.5)
-  , ( "onbibu\x00e7uk", 11.5)
-  , ( "onikibu\x00e7uk", 12.5)
-  , ( "on\x00fc\x00e7bu\x00e7uk", 13.5)
-  , ( "ond\x00f6rtbu\x00e7uk", 14.5)
-  , ( "onbe\x015fbu\x00e7uk", 15.5)
-  , ( "onalt\x0131bu\x00e7uk", 16.5)
-  , ( "onyedibu\x00e7uk", 17.5)
-  , ( "onsekizbu\x00e7uk", 18.5)
-  , ( "ondokuzbu\x00e7uk", 19.5)
-  , ( "yirmibibu\x00e7uk", 21.5)
-  , ( "yirmibirbu\x00e7uk", 21.5)
-  , ( "yirmiikibu\x00e7uk", 22.5)
-  , ( "yirmi\x00fc\x00e7bu\x00e7uk", 23.5)
-  , ( "yirmid\x00f6rtbu\x00e7uk", 24.5)
-  , ( "yirmibe\x015fbu\x00e7uk", 25.5)
-  , ( "yirmialt\x0131bu\x00e7uk", 26.5)
-  , ( "yirmiyedibu\x00e7uk", 27.5)
-  , ( "yirmisekizbu\x00e7uk", 28.5)
-  , ( "yirmidokuzbu\x00e7uk", 29.5)
-  , ( "otuzbibu\x00e7uk", 31.5)
-  , ( "otuzbirbu\x00e7uk", 31.5)
-  , ( "otuzikibu\x00e7uk", 32.5)
-  , ( "otuz\x00fc\x00e7bu\x00e7uk", 33.5)
-  , ( "otuzd\x00f6rtbu\x00e7uk", 34.5)
-  , ( "otuzbe\x015fbu\x00e7uk", 35.5)
-  , ( "otuzalt\x0131bu\x00e7uk", 36.5)
-  , ( "otuzyedibu\x00e7uk", 37.5)
-  , ( "otuzsekizbu\x00e7uk", 38.5)
-  , ( "otuzdokuzbu\x00e7uk", 39.5)
-  , ( "k\x0131rkbirbu\x00e7uk", 41.5)
-  , ( "k\x0131rkbibu\x00e7uk", 41.5)
-  , ( "k\x0131rkikibu\x00e7uk", 42.5)
-  , ( "k\x0131rk\x00fc\x00e7bu\x00e7uk", 43.5)
-  , ( "k\x0131rkd\x00f6rtbu\x00e7uk", 44.5)
-  , ( "k\x0131rkbe\x015fbu\x00e7uk", 45.5)
-  , ( "k\x0131rkalt\x0131bu\x00e7uk", 46.5)
-  , ( "k\x0131rkyedibu\x00e7uk", 47.5)
-  , ( "k\x0131rksekizbu\x00e7uk", 48.5)
-  , ( "k\x0131rkdokuzbu\x00e7uk", 49.5)
-  , ( "ellibibu\x00e7uk", 51.5)
-  , ( "ellibirbu\x00e7uk", 51.5)
-  , ( "elliikibu\x00e7uk", 52.5)
-  , ( "elli\x00fc\x00e7bu\x00e7uk", 53.5)
-  , ( "ellid\x00f6rtbu\x00e7uk", 54.5)
-  , ( "ellibe\x015fbu\x00e7uk", 55.5)
-  , ( "ellialt\x0131bu\x00e7uk", 56.5)
-  , ( "elliyedibu\x00e7uk", 57.5)
-  , ( "ellisekizbu\x00e7uk", 58.5)
-  , ( "ellidokuzbu\x00e7uk", 59.5)
-  , ( "altm\x0131\x015fbirbu\x00e7uk", 61.5)
-  , ( "atm\x0131\x015fbirbu\x00e7uk", 61.5)
-  , ( "altm\x0131\x015fikibu\x00e7uk", 62.5)
-  , ( "atm\x0131\x015fikibu\x00e7uk", 62.5)
-  , ( "atm\x0131\x015f\x00fc\x00e7bu\x00e7uk", 63.5)
-  , ( "altm\x0131\x015f\x00fc\x00e7bu\x00e7uk", 63.5)
-  , ( "altm\x0131\x015fd\x00f6rtbu\x00e7uk", 64.5)
-  , ( "atm\x0131\x015fd\x00f6rtbu\x00e7uk", 64.5)
-  , ( "altm\x0131\x015fbe\x015fbu\x00e7uk", 65.5)
-  , ( "atm\x0131\x015fbe\x015fbu\x00e7uk", 65.5)
-  , ( "altm\x0131\x015falt\x0131bu\x00e7uk", 66.5)
-  , ( "atm\x0131\x015falt\x0131bu\x00e7uk", 66.5)
-  , ( "atm\x0131\x015fyedibu\x00e7uk", 67.5)
-  , ( "altm\x0131\x015fyedibu\x00e7uk", 67.5)
-  , ( "altm\x0131\x015fsekizbu\x00e7uk", 68.5)
-  , ( "atm\x0131\x015fsekizbu\x00e7uk", 68.5)
-  , ( "altm\x0131\x015fdokuzbu\x00e7uk", 69.5)
-  , ( "atm\x0131\x015fdokuzbu\x00e7uk", 69.5)
-  , ( "yetmi\x015fbibu\x00e7uk", 71.5)
-  , ( "yetmi\x015fbirbu\x00e7uk", 71.5)
-  , ( "yetmi\x015fikibu\x00e7uk", 72.5)
-  , ( "yetmi\x015f\x00fc\x00e7bu\x00e7uk", 73.5)
-  , ( "yetmi\x015fd\x00f6rtbu\x00e7uk", 74.5)
-  , ( "yetmi\x015fbe\x015fbu\x00e7uk", 75.5)
-  , ( "yetmi\x015falt\x0131bu\x00e7uk", 76.5)
-  , ( "yetmi\x015fyedibu\x00e7uk", 77.5)
-  , ( "yetmi\x015fsekizbu\x00e7uk", 78.5)
-  , ( "yetmi\x015fdokuzbu\x00e7uk", 79.5)
-  , ( "seksenbibu\x00e7uk", 81.5)
-  , ( "seksenbirbu\x00e7uk", 81.5)
-  , ( "seksenikibu\x00e7uk", 82.5)
-  , ( "seksen\x00fc\x00e7bu\x00e7uk", 83.5)
-  , ( "seksend\x00f6rtbu\x00e7uk", 84.5)
-  , ( "seksenbe\x015fbu\x00e7uk", 85.5)
-  , ( "seksenalt\x0131bu\x00e7uk", 86.5)
-  , ( "seksenyedibu\x00e7uk", 87.5)
-  , ( "seksensekizbu\x00e7uk", 88.5)
-  , ( "seksendokuzbu\x00e7uk", 89.5)
-  , ( "doksanbirbu\x00e7uk", 91.5)
-  , ( "doksanbibu\x00e7uk", 91.5)
-  , ( "doksanikibu\x00e7uk", 92.5)
-  , ( "doksan\x00fc\x00e7bu\x00e7uk", 93.5)
-  , ( "doksand\x00f6rtbu\x00e7uk", 94.5)
-  , ( "doksanbe\x015fbu\x00e7uk", 95.5)
-  , ( "doksanalt\x0131bu\x00e7uk", 96.5)
-  , ( "doksanyedibu\x00e7uk", 97.5)
-  , ( "doksansekizbu\x00e7uk", 98.5)
-  , ( "doksandokuzbu\x00e7uk", 99.5)
+  [ ( "onbirbuçuk", 11.5)
+  , ( "onbibuçuk", 11.5)
+  , ( "onikibuçuk", 12.5)
+  , ( "onüçbuçuk", 13.5)
+  , ( "ondörtbuçuk", 14.5)
+  , ( "onbeşbuçuk", 15.5)
+  , ( "onaltıbuçuk", 16.5)
+  , ( "onyedibuçuk", 17.5)
+  , ( "onsekizbuçuk", 18.5)
+  , ( "ondokuzbuçuk", 19.5)
+  , ( "yirmibibuçuk", 21.5)
+  , ( "yirmibirbuçuk", 21.5)
+  , ( "yirmiikibuçuk", 22.5)
+  , ( "yirmiüçbuçuk", 23.5)
+  , ( "yirmidörtbuçuk", 24.5)
+  , ( "yirmibeşbuçuk", 25.5)
+  , ( "yirmialtıbuçuk", 26.5)
+  , ( "yirmiyedibuçuk", 27.5)
+  , ( "yirmisekizbuçuk", 28.5)
+  , ( "yirmidokuzbuçuk", 29.5)
+  , ( "otuzbibuçuk", 31.5)
+  , ( "otuzbirbuçuk", 31.5)
+  , ( "otuzikibuçuk", 32.5)
+  , ( "otuzüçbuçuk", 33.5)
+  , ( "otuzdörtbuçuk", 34.5)
+  , ( "otuzbeşbuçuk", 35.5)
+  , ( "otuzaltıbuçuk", 36.5)
+  , ( "otuzyedibuçuk", 37.5)
+  , ( "otuzsekizbuçuk", 38.5)
+  , ( "otuzdokuzbuçuk", 39.5)
+  , ( "kırkbirbuçuk", 41.5)
+  , ( "kırkbibuçuk", 41.5)
+  , ( "kırkikibuçuk", 42.5)
+  , ( "kırküçbuçuk", 43.5)
+  , ( "kırkdörtbuçuk", 44.5)
+  , ( "kırkbeşbuçuk", 45.5)
+  , ( "kırkaltıbuçuk", 46.5)
+  , ( "kırkyedibuçuk", 47.5)
+  , ( "kırksekizbuçuk", 48.5)
+  , ( "kırkdokuzbuçuk", 49.5)
+  , ( "ellibibuçuk", 51.5)
+  , ( "ellibirbuçuk", 51.5)
+  , ( "elliikibuçuk", 52.5)
+  , ( "elliüçbuçuk", 53.5)
+  , ( "ellidörtbuçuk", 54.5)
+  , ( "ellibeşbuçuk", 55.5)
+  , ( "ellialtıbuçuk", 56.5)
+  , ( "elliyedibuçuk", 57.5)
+  , ( "ellisekizbuçuk", 58.5)
+  , ( "ellidokuzbuçuk", 59.5)
+  , ( "altmışbirbuçuk", 61.5)
+  , ( "atmışbirbuçuk", 61.5)
+  , ( "altmışikibuçuk", 62.5)
+  , ( "atmışikibuçuk", 62.5)
+  , ( "atmışüçbuçuk", 63.5)
+  , ( "altmışüçbuçuk", 63.5)
+  , ( "altmışdörtbuçuk", 64.5)
+  , ( "atmışdörtbuçuk", 64.5)
+  , ( "altmışbeşbuçuk", 65.5)
+  , ( "atmışbeşbuçuk", 65.5)
+  , ( "altmışaltıbuçuk", 66.5)
+  , ( "atmışaltıbuçuk", 66.5)
+  , ( "atmışyedibuçuk", 67.5)
+  , ( "altmışyedibuçuk", 67.5)
+  , ( "altmışsekizbuçuk", 68.5)
+  , ( "atmışsekizbuçuk", 68.5)
+  , ( "altmışdokuzbuçuk", 69.5)
+  , ( "atmışdokuzbuçuk", 69.5)
+  , ( "yetmişbibuçuk", 71.5)
+  , ( "yetmişbirbuçuk", 71.5)
+  , ( "yetmişikibuçuk", 72.5)
+  , ( "yetmişüçbuçuk", 73.5)
+  , ( "yetmişdörtbuçuk", 74.5)
+  , ( "yetmişbeşbuçuk", 75.5)
+  , ( "yetmişaltıbuçuk", 76.5)
+  , ( "yetmişyedibuçuk", 77.5)
+  , ( "yetmişsekizbuçuk", 78.5)
+  , ( "yetmişdokuzbuçuk", 79.5)
+  , ( "seksenbibuçuk", 81.5)
+  , ( "seksenbirbuçuk", 81.5)
+  , ( "seksenikibuçuk", 82.5)
+  , ( "seksenüçbuçuk", 83.5)
+  , ( "seksendörtbuçuk", 84.5)
+  , ( "seksenbeşbuçuk", 85.5)
+  , ( "seksenaltıbuçuk", 86.5)
+  , ( "seksenyedibuçuk", 87.5)
+  , ( "seksensekizbuçuk", 88.5)
+  , ( "seksendokuzbuçuk", 89.5)
+  , ( "doksanbirbuçuk", 91.5)
+  , ( "doksanbibuçuk", 91.5)
+  , ( "doksanikibuçuk", 92.5)
+  , ( "doksanüçbuçuk", 93.5)
+  , ( "doksandörtbuçuk", 94.5)
+  , ( "doksanbeşbuçuk", 95.5)
+  , ( "doksanaltıbuçuk", 96.5)
+  , ( "doksanyedibuçuk", 97.5)
+  , ( "doksansekizbuçuk", 98.5)
+  , ( "doksandokuzbuçuk", 99.5)
   ]
 
 ruleInteger9 :: Rule
 ruleInteger9 = Rule
   { name = "integer 11..19 21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99"
   , pattern =
-    [ regex "((on|yirmi|otuz|k\x0131rk|elli|atm\x0131\x015f|altm\x0131\x015f|yetmi\x015f|seksen|doksan)(bir|bi|iki|\x00fc\x00e7|d\x00f6rt|be\x015f|alt\x0131|yedi|sekiz|dokuz)(bu\x00e7uk))"
+    [ regex "((on|yirmi|otuz|kırk|elli|atmış|altmış|yetmiş|seksen|doksan)(bir|bi|iki|üç|dört|beş|altı|yedi|sekiz|dokuz)(buçuk))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -541,7 +541,7 @@
 ruleDozen = Rule
   { name = "dozen"
   , pattern =
-    [ regex "d\x00fczine"
+    [ regex "düzine"
     ]
   , prod = \_ -> integer 12 >>= withGrain 1 >>= withMultipliable
   }
@@ -550,16 +550,16 @@
 oneToNineMap = HashMap.fromList
   [ ( "s\305f\305r", 0)
   , ( "yok", 0)
-  , ( "hi\x00e7", 0)
+  , ( "hiç", 0)
   , ( "bir", 1)
   , ( "bi", 1)
   , ( "yek", 1)
   , ( "tek", 1)
   , ( "iki", 2)
-  , ( "\x00fc\x00e7", 3)
-  , ( "d\x00f6rt", 4)
-  , ( "be\x015f", 5)
-  , ( "alt\x0131", 6)
+  , ( "üç", 3)
+  , ( "dört", 4)
+  , ( "beş", 5)
+  , ( "altı", 6)
   , ( "yedi", 7)
   , ( "sekiz", 8)
   , ( "dokuz", 9)
@@ -569,7 +569,7 @@
 ruleInteger = Rule
   { name = "integer (0..9)"
   , pattern =
-    [ regex "(yok|hi(\x00e7)|s(\x0131)f(\x0131)r|bir?|[ty]ek|iki|(\x00fc)(\x00e7)|d(\x00f6)rt|be(\x015f)|alt(\x0131)|yedi|sekiz|dokuz)"
+    [ regex "(yok|hi(ç)|s(ı)f(ı)r|bir?|[ty]ek|iki|(ü)(ç)|d(ö)rt|be(ş)|alt(ı)|yedi|sekiz|dokuz)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -579,23 +579,23 @@
 
 numeralSuffixesHalfsuffixText2Map :: HashMap Text Double
 numeralSuffixesHalfsuffixText2Map = HashMap.fromList
-  [ ( "onbu\x00e7uk", 10.5)
-  , ( "yirmibu\x00e7uk", 20.5)
-  , ( "otuzbu\x00e7uk", 30.5)
-  , ( "k\x0131rkbu\x00e7uk", 40.5)
-  , ( "ellibu\x00e7uk", 50.5)
-  , ( "atm\x0131\x015fbu\x00e7uk", 60.5)
-  , ( "altm\x0131\x015fbu\x00e7uk", 60.5)
-  , ( "yetmi\x015fbu\x00e7uk", 70.5)
-  , ( "seksenbu\x00e7uk", 80.5)
-  , ( "doksanbu\x00e7uk", 90.5)
+  [ ( "onbuçuk", 10.5)
+  , ( "yirmibuçuk", 20.5)
+  , ( "otuzbuçuk", 30.5)
+  , ( "kırkbuçuk", 40.5)
+  , ( "ellibuçuk", 50.5)
+  , ( "atmışbuçuk", 60.5)
+  , ( "altmışbuçuk", 60.5)
+  , ( "yetmişbuçuk", 70.5)
+  , ( "seksenbuçuk", 80.5)
+  , ( "doksanbuçuk", 90.5)
   ]
 
 ruleNumeralSuffixesHalfsuffixText2 :: Rule
 ruleNumeralSuffixesHalfsuffixText2 = Rule
   { name = "number suffixes (half-suffix text) (10..90)"
   , pattern =
-    [ regex "((on|yirmi|otuz|k\x0131rk|elli|atm\x0131\x015f|altm\x0131\x015f|yetmi\x015f|seksen|doksan)(bu\x00e7uk))"
+    [ regex "((on|yirmi|otuz|kırk|elli|atmış|altmış|yetmiş|seksen|doksan)(buçuk))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -609,7 +609,7 @@
   { name = "number suffixes (half-suffix)"
   , pattern =
     [ dimension Numeral
-    , regex "(bu\x00e7uk)(?=[\\W\\$\x20ac]|$)"
+    , regex "(buçuk)(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v + 0.5
@@ -644,11 +644,11 @@
   [ ( "on", 10)
   , ( "yirmi", 20)
   , ( "otuz", 30)
-  , ( "k\x0131rk", 40)
+  , ( "kırk", 40)
   , ( "elli", 50)
-  , ( "altm\x0131\x015f", 60)
-  , ( "atm\x0131\x015f", 60)
-  , ( "yetmi\x015f", 70)
+  , ( "altmış", 60)
+  , ( "atmış", 60)
+  , ( "yetmiş", 70)
   , ( "seksen", 80)
   , ( "doksan", 90)
   ]
@@ -657,7 +657,7 @@
 ruleInteger2 = Rule
   { name = "integer (10..90)"
   , pattern =
-    [ regex "(on|yirmi|otuz|k\x0131rk|elli|atm\x0131\x015f|altm\x0131\x015f|yetmi\x015f|seksen|doksan)"
+    [ regex "(on|yirmi|otuz|kırk|elli|atmış|altmış|yetmiş|seksen|doksan)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -669,7 +669,7 @@
 ruleQuarter = Rule
   { name = "quarter"
   , pattern =
-    [ regex "(\x00e7eyrek)"
+    [ regex "(çeyrek)"
     ]
   , prod = \_ -> double 0.25
   }
@@ -679,7 +679,7 @@
   { name = "number dot number"
   , pattern =
     [ dimension Numeral
-    , regex "nokta|virg\x00fcl"
+    , regex "nokta|virgül"
     , numberWith TNumeral.grain isNothing
     ]
   , prod = \tokens -> case tokens of
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = UK}, allExamples)
+corpus = (testContext {locale = makeLocale UK Nothing}, 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
@@ -29,21 +29,21 @@
 
 twentyNinetyMap :: HashMap Text Integer
 twentyNinetyMap = HashMap.fromList
-  [ ( "\x0434\x0432\x0430\x0434\x0446\x044f\x0442\x044c"             , 20 )
-  , ( "\x0442\x0440\x0438\x0434\x0446\x044f\x0442\x044c"             , 30 )
-  , ( "\x0441\x043e\x0440\x043e\x043a"                               , 40 )
-  , ( "\x043f\x2018\x044f\x0442\x0434\x0435\x0441\x044f\x0442"       , 50 )
-  , ( "\x0448\x0456\x0441\x0442\x0434\x0435\x0441\x044f\x0442"       , 60 )
-  , ( "\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442"             , 70 )
-  , ( "\x0434\x0435\x0432\x2018\x044f\x043d\x043e\x0441\x0442\x043e" , 90 )
-  , ( "\x0432\x0456\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442" , 80 )
+  [ ( "двадцять"             , 20 )
+  , ( "тридцять"             , 30 )
+  , ( "сорок"                               , 40 )
+  , ( "п‘ятдесят"       , 50 )
+  , ( "шістдесят"       , 60 )
+  , ( "сімдесят"             , 70 )
+  , ( "дев‘яносто" , 90 )
+  , ( "вісімдесят" , 80 )
   ]
 
 ruleInteger5 :: Rule
 ruleInteger5 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(\x0434\x0432\x0430\x0434\x0446\x044f\x0442\x044c|\x0442\x0440\x0438\x0434\x0446\x044f\x0442\x044c|\x0441\x043e\x0440\x043e\x043a|\x043f\x2018\x044f\x0442\x0434\x0435\x0441\x044f\x0442|\x0448\x0456\x0441\x0442\x0434\x0435\x0441\x044f\x0442|\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442|\x0432\x0456\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442|\x0434\x0435\x0432\x2018\x044f\x043d\x043e\x0441\x0442\x043e)"
+    [ regex "(двадцять|тридцять|сорок|п‘ятдесят|шістдесят|сімдесят|вісімдесят|дев‘яносто)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -91,28 +91,28 @@
 ruleInteger3 = Rule
   { name = "integer 2"
   , pattern =
-    [ regex "(\x0434\x0432\x0430|\x0434\x0432\x0456|\x0434\x0432\x043e\x0454|\x043f\x0430\x0440\x0430|\x043f\x0430\x0440\x0443|\x043f\x0430\x0440\x043e\x0447\x043a\x0443|\x043f\x0430\x0440\x043e\x0447\x043a\x0430)"
+    [ regex "(два|дві|двоє|пара|пару|парочку|парочка)"
     ]
   , prod = \_ -> integer 2
   }
 
 hundredsMap :: HashMap Text Integer
 hundredsMap = HashMap.fromList
-  [ ( "\x0441\x0442\x043e"                                     , 100 )
-  , ( "\x0434\x0432\x0456\x0441\x0442\x0456"                   , 200 )
-  , ( "\x0442\x0440\x0438\x0441\x0442\x0430"                   , 300 )
-  , ( "\x0447\x043e\x0442\x0438\x0440\x0438\x0441\x0442\x0430" , 400 )
-  , ( "\x043f\x2018\x044f\x0442\x0441\x043e\x0442"             , 500 )
-  , ( "\x0448\x0456\x0441\x0442\x0441\x043e\x0442"             , 600 )
-  , ( "\x0441\x0456\x043c\x0441\x043e\x0442"                   , 700 )
-  , ( "\x0432\x0456\x0441\x0456\x043c\x0441\x043e\x0442"       , 800 )
-  , ( "\x0434\x0435\x0432\x2018\x044f\x0442\x0441\x043e\x0442" , 900 )
+  [ ( "сто"                                     , 100 )
+  , ( "двісті"                   , 200 )
+  , ( "триста"                   , 300 )
+  , ( "чотириста" , 400 )
+  , ( "п‘ятсот"             , 500 )
+  , ( "шістсот"             , 600 )
+  , ( "сімсот"                   , 700 )
+  , ( "вісімсот"       , 800 )
+  , ( "дев‘ятсот" , 900 )
   ]
 ruleInteger6 :: Rule
 ruleInteger6 = Rule
   { name = "integer (100..900)"
   , pattern =
-    [ regex "(\x0441\x0442\x043e|\x0434\x0432\x0456\x0441\x0442\x0456|\x0442\x0440\x0438\x0441\x0442\x0430|\x0447\x043e\x0442\x0438\x0440\x0438\x0441\x0442\x0430|\x043f\x2018\x044f\x0442\x0441\x043e\x0442|\x0448\x0456\x0441\x0442\x0441\x043e\x0442|\x0441\x0456\x043c\x0441\x043e\x0442|\x0432\x0456\x0441\x0456\x043c\x0441\x043e\x0442|\x0434\x0435\x0432\x2018\x044f\x0442\x0441\x043e\x0442)"
+    [ regex "(сто|двісті|триста|чотириста|п‘ятсот|шістсот|сімсот|вісімсот|дев‘ятсот)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -124,7 +124,7 @@
 ruleNumeralsPrefixWithMinus = Rule
   { name = "numbers prefix with -, minus"
   , pattern =
-    [ regex "-|\x043c\x0456\x043d\x0443\x0441\\s?"
+    [ regex "-|мінус\\s?"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -137,18 +137,18 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "((\x043a|\x043c|\x0433)|(\x041a|\x041c|\x0413))(?=[\\W\\$\x20ac]|$)"
+    , regex "((к|м|г)|(К|М|Г))(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
        Token RegexMatch (GroupMatch (match:_)):
        _) -> case Text.toLower match of
-         "\x043a" -> double $ v * 1e3
-         "\x041a" -> double $ v * 1e3
-         "\x043c" -> double $ v * 1e6
-         "\x041c" -> double $ v * 1e6
-         "\x0433" -> double $ v * 1e9
-         "\x0413" -> double $ v * 1e9
+         "к" -> double $ v * 1e3
+         "К" -> double $ v * 1e3
+         "м" -> double $ v * 1e6
+         "М" -> double $ v * 1e6
+         "г" -> double $ v * 1e9
+         "Г" -> double $ v * 1e9
          _   -> Nothing
       _ -> Nothing
   }
@@ -185,36 +185,36 @@
 ruleInteger = Rule
   { name = "integer 0"
   , pattern =
-    [ regex "(\x043d\x0443\x043b\x044c)"
+    [ regex "(нуль)"
     ]
   , prod = \_ -> integer 0
   }
 
 threeNineteenMap :: HashMap Text Integer
 threeNineteenMap = HashMap.fromList
-  [ ( "\x0442\x0440\x0438"                                           , 3 )
-  , ( "\x0447\x043e\x0442\x0438\x0440\x0438"                         , 4 )
-  , ( "\x043f\x2018\x044f\x0442\x044c"                               , 5 )
-  , ( "\x0448\x0456\x0441\x0442\x044c"                               , 6 )
-  , ( "\x0441\x0456\x043c"                                           , 7 )
-  , ( "\x0432\x0456\x0441\x0456\x043c"                               , 8 )
-  , ( "\x0434\x0435\x0432\x2018\x044f\x0442\x044c"                   , 9 )
-  , ( "\x0434\x0435\x0441\x044f\x0442\x044c"                         , 10 )
-  , ( "\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x044f\x0442\x044c" , 11 )
-  , ( "\x0434\x0432\x0430\x043d\x0430\x0434\x0446\x044f\x0442\x044c" , 12 )
-  , ( "\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x044f\x0442\x044c" , 13 )
-  , ( "\x0447\x043e\x0442\x0438\x0440\x043d\x0430\x0434\x0446\x044f\x0442\x044c" , 14 )
-  , ( "\x043f\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442\x044c"       , 15 )
-  , ( "\x0448\x0456\x0441\x0442\x043d\x0430\x0434\x0446\x044f\x0442\x044c"       , 16 )
-  , ( "\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442\x044c"             , 17 )
-  , ( "\x0432\x0456\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442\x044c" , 18 )
-  , ( "\x0434\x0435\x0432\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442\x044c" , 19 )
+  [ ( "три"                                           , 3 )
+  , ( "чотири"                         , 4 )
+  , ( "п‘ять"                               , 5 )
+  , ( "шість"                               , 6 )
+  , ( "сім"                                           , 7 )
+  , ( "вісім"                               , 8 )
+  , ( "дев‘ять"                   , 9 )
+  , ( "десять"                         , 10 )
+  , ( "одинадцять" , 11 )
+  , ( "дванадцять" , 12 )
+  , ( "тринадцять" , 13 )
+  , ( "чотирнадцять" , 14 )
+  , ( "п‘ятнадцять"       , 15 )
+  , ( "шістнадцять"       , 16 )
+  , ( "сімнадцять"             , 17 )
+  , ( "вісімнадцять" , 18 )
+  , ( "дев‘ятнадцять" , 19 )
   ]
 ruleInteger4 :: Rule
 ruleInteger4 = Rule
   { name = "integer (3..19)"
   , pattern =
-    [ regex "(\x0442\x0440\x0438|\x0447\x043e\x0442\x0438\x0440\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x0447\x043e\x0442\x0438\x0440\x0438|\x043f\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x043f\x2018\x044f\x0442\x044c|\x0448\x0456\x0441\x0442\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x0448\x0456\x0441\x0442\x044c|\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x0441\x0456\x043c|\x0432\x0456\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x0432\x0456\x0441\x0456\x043c|\x0434\x0435\x0432\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x0434\x0435\x0432\x2018\x044f\x0442\x044c|\x0434\x0435\x0441\x044f\x0442\x044c|\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x0434\x0432\x0430\x043d\x0430\x0434\x0446\x044f\x0442\x044c|\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x044f\x0442\x044c)"
+    [ regex "(три|чотирнадцять|чотири|п‘ятнадцять|п‘ять|шістнадцять|шість|сімнадцять|сім|вісімнадцять|вісім|дев‘ятнадцять|дев‘ять|десять|одинадцять|дванадцять|тринадцять)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -226,7 +226,7 @@
 ruleInteger2 = Rule
   { name = "integer 1"
   , pattern =
-    [ regex "(\x043e\x0434\x0438\x043d|\x043e\x0434\x043d\x0430|\x043e\x0434\x043d\x0443|\x043e\x0434\x043d\x0435|\x043e\x0434\x043d\x043e\x0433\x043e)"
+    [ regex "(один|одна|одну|одне|одного)"
     ]
   , prod = \_ -> integer 1
   }
@@ -236,7 +236,7 @@
   { name = "number dot number"
   , pattern =
     [ dimension Numeral
-    , regex "\x043a\x0440\x0430\x043f\x043a\x0430"
+    , regex "крапка"
     , numberWith TNumeral.grain isNothing
     ]
   , prod = \tokens -> case tokens of
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = VI}, allExamples)
+corpus = (testContext {locale = makeLocale VI Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
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
@@ -27,21 +27,21 @@
 
 powersOfTenMap :: HashMap.HashMap Text.Text (Double, Int)
 powersOfTenMap = HashMap.fromList
-  [ ( "tr\x0103",   (1e2, 2) )
-  , ( "tr\x0103m",  (1e2, 2) )
-  , ( "ngh\x00ec",  (1e3, 3) )
-  , ( "ngh\x00ecn", (1e3, 3) )
-  , ( "tri\x1ec7",  (1e6, 6) )
-  , ( "tri\x1ec7u", (1e6, 6) )
+  [ ( "tră",   (1e2, 2) )
+  , ( "trăm",  (1e2, 2) )
+  , ( "nghì",  (1e3, 3) )
+  , ( "nghìn", (1e3, 3) )
+  , ( "triệ",  (1e6, 6) )
+  , ( "triệu", (1e6, 6) )
   , ( "t",          (1e9, 9) )
-  , ( "t\x1ef7",    (1e9, 9) )
+  , ( "tỷ",    (1e9, 9) )
   ]
 
 rulePowersOfTen :: Rule
 rulePowersOfTen = Rule
   { name = "powers of tens"
   , pattern =
-    [ regex "(tr\x0103m?|ngh\x00ecn?|tri\x1ec7u?|t\x1ef7?)"
+    [ regex "(trăm?|nghìn?|triệu?|tỷ?)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -84,7 +84,7 @@
 ruleNumeralsPrefixWithM = Rule
   { name = "numbers prefix with -, âm"
   , pattern =
-    [ regex "-|\x00e2m\\s?"
+    [ regex "-|âm\\s?"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -97,7 +97,7 @@
   { name = "numbers 25 35 45 55 65 75 85 95"
   , pattern =
     [ oneOf [20, 30 .. 90]
-    , regex "l\x0103m"
+    , regex "lăm"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v + 5
@@ -146,7 +146,7 @@
   { name = "number dot 1 9"
   , pattern =
     [ dimension Numeral
-    , regex "ch\x1ea5m|ph\x1ea9y"
+    , regex "chấm|phẩy"
     , numberWith TNumeral.grain isNothing
     ]
   , prod = \tokens -> case tokens of
@@ -186,7 +186,7 @@
   { name = "numbers suffixes (K, M, G)"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])(?=[\\W\\$\x20ac]|$)"
+    , regex "([kmg])(?=[\\W\\$€]|$)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):
@@ -215,53 +215,53 @@
 
 integerMap :: HashMap.HashMap Text.Text Integer
 integerMap = HashMap.fromList
-  [ ("kh\x00f4ng",               0)
-  , ("m\x1ed9t",                 1)
-  , ("linh m\x1ed9t",            1)
-  , ("l\x1ebb m\x1ed9t",         1)
+  [ ("không",               0)
+  , ("một",                 1)
+  , ("linh một",            1)
+  , ("lẻ một",         1)
   , ("hai",                      2)
-  , ("l\x1ebb hai",              2)
+  , ("lẻ hai",              2)
   , ("linh hai",                 2)
   , ("ba",                       3)
-  , ("l\x1ebb",                  3)
+  , ("lẻ",                  3)
   , ("linh ba",                  3)
-  , ("l\x1ebb b\x1ed1n",         4)
-  , ("linh b\x1ed1n",            4)
-  , ("b\x1ed1n",                 4)
-  , ("n\x0103m",                 5)
-  , ("l\x1ebb n\x0103m",         5)
-  , ("linh n\x0103m",            5)
-  , ("linh s\x00e1u",            6)
-  , ("s\x00e1u",                 6)
-  , ("l\x1ebb s\x00e1u",         6)
-  , ("linh b\x1ea3y",            7)
-  , ("l\x1ebb b\x1ea3y",         7)
-  , ("b\x1ea3y",                 7)
-  , ("l\x1ebb t\x00e1m",         8)
-  , ("linh t\x00e1m",            8)
-  , ("t\x00e1m",                 8)
-  , ("l\x1ebb ch\x00edn",        9)
-  , ("ch\x00edn",                9)
-  , ("linh ch\x00edn",           9)
-  , ("linh m\x01b0\x1eddi",      10)
-  , ("m\x01b0\x1eddi",           10)
-  , ("l\x1ebb m\x01b0\x1eddi",   10)
-  , ("m\x01b0\x1eddi m\x1ed9t",  11)
-  , ("m\x01b0\x1eddi hai",       12)
-  , ("m\x01b0\x1eddi ba",        13)
-  , ("m\x01b0\x1eddi b\x1ed1n",  14)
-  , ("m\x01b0\x1eddi l\x0103m",  15)
-  , ("m\x01b0\x1eddi s\x00e1u",  16)
-  , ("m\x01b0\x1eddi b\x1ea3y",  17)
-  , ("m\x01b0\x1eddi t\x00e1m",  18)
-  , ("m\x01b0\x1eddi ch\x00edn", 19)
+  , ("lẻ bốn",         4)
+  , ("linh bốn",            4)
+  , ("bốn",                 4)
+  , ("năm",                 5)
+  , ("lẻ năm",         5)
+  , ("linh năm",            5)
+  , ("linh sáu",            6)
+  , ("sáu",                 6)
+  , ("lẻ sáu",         6)
+  , ("linh bảy",            7)
+  , ("lẻ bảy",         7)
+  , ("bảy",                 7)
+  , ("lẻ tám",         8)
+  , ("linh tám",            8)
+  , ("tám",                 8)
+  , ("lẻ chín",        9)
+  , ("chín",                9)
+  , ("linh chín",           9)
+  , ("linh mười",      10)
+  , ("mười",           10)
+  , ("lẻ mười",   10)
+  , ("mười một",  11)
+  , ("mười hai",       12)
+  , ("mười ba",        13)
+  , ("mười bốn",  14)
+  , ("mười lăm",  15)
+  , ("mười sáu",  16)
+  , ("mười bảy",  17)
+  , ("mười tám",  18)
+  , ("mười chín", 19)
   ]
 
 ruleInteger :: Rule
 ruleInteger = Rule
   { name = "integer (0..19)"
   , pattern =
-    [ regex "(kh\x00f4ng|m\x1ed9t|linh m\x1ed9t|l\x1ebb m\x1ed9t|hai|linh hai|l\x1ebb hai|ba|linh ba|l\x1ebb ba|b\x1ed1n|linh b\x1ed1n|l\x1ebb b\x1ed1n|n\x0103m|linh n\x0103m|l\x1ebb n\x0103m|s\x00e1u|l\x1ebb s\x00e1u|linh s\x00e1u|b\x1ea3y|l\x1ebb b\x1ea3y|linh b\x1ea3y|t\x00e1m|linh t\x00e1m|l\x1ebb t\x00e1m|ch\x00edn|linh ch\x00edn|l\x1ebb ch\x00edn|m\x01b0\x1eddi m\x1ed9t|m\x01b0\x1eddi hai|m\x01b0\x1eddi ba|m\x01b0\x1eddi b\x1ed1n|m\x01b0\x1eddi l\x0103m|m\x01b0\x1eddi s\x00e1u|m\x01b0\x1eddi b\x1ea3y|m\x01b0\x1eddi t\x00e1m|m\x01b0\x1eddi ch\x00edn|m\x01b0\x1eddi|linh m\x01b0\x1eddi)"
+    [ regex "(không|một|linh một|lẻ một|hai|linh hai|lẻ hai|ba|linh ba|lẻ ba|bốn|linh bốn|lẻ bốn|năm|linh năm|lẻ năm|sáu|lẻ sáu|linh sáu|bảy|lẻ bảy|linh bảy|tám|linh tám|lẻ tám|chín|linh chín|lẻ chín|mười một|mười hai|mười ba|mười bốn|mười lăm|mười sáu|mười bảy|mười tám|mười chín|mười|linh mười)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -271,21 +271,21 @@
 
 tensMap :: HashMap.HashMap Text.Text Integer
 tensMap = HashMap.fromList
-  [ ("hai m\x01b0\x01a1i",       20)
-  , ("ba m\x01b0\x01a1i",        30)
-  , ("b\x1ed1n m\x01b0\x01a1i",  40)
-  , ("n\x0103m m\x01b0\x01a1i",  50)
-  , ("s\x00e1u m\x01b0\x01a1i",  60)
-  , ("b\x1ea3y m\x01b0\x01a1i",  70)
-  , ("t\x00e1m m\x01b0\x01a1i",  80)
-  , ("ch\x00edn m\x01b0\x01a1i", 90)
+  [ ("hai mươi",       20)
+  , ("ba mươi",        30)
+  , ("bốn mươi",  40)
+  , ("năm mươi",  50)
+  , ("sáu mươi",  60)
+  , ("bảy mươi",  70)
+  , ("tám mươi",  80)
+  , ("chín mươi", 90)
   ]
 
 ruleInteger2 :: Rule
 ruleInteger2 = Rule
   { name = "integer (20..90)"
   , pattern =
-    [ regex "(hai m\x01b0\x01a1i|ba m\x01b0\x01a1i|b\x1ed1n m\x01b0\x01a1i|n\x0103m m\x01b0\x01a1i|s\x00e1u m\x01b0\x01a1i|b\x1ea3y m\x01b0\x01a1i|t\x00e1m m\x01b0\x01a1i|ch\x00edn m\x01b0\x01a1i)"
+    [ regex "(hai mươi|ba mươi|bốn mươi|năm mươi|sáu mươi|bảy mươi|tám mươi|chín mươi)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -298,7 +298,7 @@
   { name = "numbers 21 31 41 51 61 71 81 91"
   , pattern =
     [ oneOf [20, 30 .. 90]
-    , regex "m\x1ed1t"
+    , regex "mốt"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v + 1
@@ -309,7 +309,7 @@
 ruleT = Rule
   { name = "tá"
   , pattern =
-    [ regex "t\x00e1"
+    [ regex "tá"
     ]
   , prod = \_ -> integer 12 >>= withGrain 1 >>= withMultipliable
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Numeral.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ZH}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
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
@@ -29,7 +29,7 @@
 ruleInteger5 = Rule
   { name = "integer (0..10)"
   , pattern =
-    [ regex "(\x3007|\x96f6|\x4e00|\x4e8c|\x4e24|\x5169|\x4e09|\x56db|\x4e94|\x516d|\x4e03|\x516b|\x4e5d|\x5341)(\x4e2a|\x500b)?"
+    [ regex "(〇|零|一|二|两|兩|三|四|五|六|七|八|九|十)(个|個)?"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -39,20 +39,20 @@
 
 integerMap :: HashMap.HashMap Text.Text Integer
 integerMap = HashMap.fromList
-  [ ( "\x3007", 0 )
-  , ( "\x96f6", 0 )
-  , ( "\x4e00", 1 )
-  , ( "\x5169", 2 )
-  , ( "\x4e24", 2 )
-  , ( "\x4e8c", 2 )
-  , ( "\x4e09", 3 )
-  , ( "\x56db", 4 )
-  , ( "\x4e94", 5 )
-  , ( "\x516d", 6 )
-  , ( "\x4e03", 7 )
-  , ( "\x516b", 8 )
-  , ( "\x4e5d", 9 )
-  , ( "\x5341", 10 )
+  [ ( "〇", 0 )
+  , ( "零", 0 )
+  , ( "一", 1 )
+  , ( "兩", 2 )
+  , ( "两", 2 )
+  , ( "二", 2 )
+  , ( "三", 3 )
+  , ( "四", 4 )
+  , ( "五", 5 )
+  , ( "六", 6 )
+  , ( "七", 7 )
+  , ( "八", 8 )
+  , ( "九", 9 )
+  , ( "十", 10 )
   ]
 
 
@@ -60,7 +60,7 @@
 ruleNumeralsPrefixWithNegativeOrMinus = Rule
   { name = "numbers prefix with -, negative or minus"
   , pattern =
-    [ regex "-|\x8d1f\\s?|\x8ca0\\s?"
+    [ regex "-|负\\s?|負\\s?"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
@@ -109,7 +109,7 @@
   { name = "<number>个"
   , pattern =
     [ dimension Numeral
-    , regex "\x4e2a"
+    , regex "个"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> Just token
@@ -121,7 +121,7 @@
   { name = "integer (20..90)"
   , pattern =
     [ numberBetween 2 10
-    , regex "\x5341"
+    , regex "十"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) -> double $ v * 10
@@ -164,7 +164,7 @@
 ruleInteger2 = Rule
   { name = "integer (11..19)"
   , pattern =
-    [ regex "\x5341"
+    [ regex "十"
     , numberBetween 1 10
     ]
   , prod = \tokens -> case tokens of
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = AR}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples =
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
@@ -22,7 +22,7 @@
 ruleOrdinalsTh = Rule
   { name = "ordinals 7th"
   , pattern =
-    [ regex "(\x0633\x0627\x0628\x0639 | \x0633\x0627\x0628\x0639\x0629 | \x0627\x0644\x0633\x0627\x0628\x0639 | \x0627\x0644\x0633\x0627\x0628\x0639\x0629)"
+    [ regex "(سابع | سابعة | السابع | السابعة)"
     ]
   , prod = \_ -> Just $ ordinal 7
   }
@@ -31,7 +31,7 @@
 ruleOrdinalsSecond = Rule
   { name = "ordinals second"
   , pattern =
-    [ regex "(\x062b\x0627\x0646\x064a|\x062b\x0627\x0646\x064a\x0629|\x0627\x0644\x062b\x0627\x0646\x064a|\x0627\x0644\x062b\x0627\x0646\x064a\x0629)"
+    [ regex "(ثاني|ثانية|الثاني|الثانية)"
     ]
   , prod = \_ -> Just $ ordinal 2
   }
@@ -40,7 +40,7 @@
 ruleOrdinalsFirst = Rule
   { name = "ordinals first"
   , pattern =
-    [ regex "(\x0623\x0648\x0644|\x0627\x0644\x0623\x0648\x0644|\x0623\x0648\x0644\x0649|\x0627\x0644\x0623\x0648\x0644\x0649)"
+    [ regex "(أول|الأول|أولى|الأولى)"
     ]
   , prod = \_ -> Just $ ordinal 1
   }
@@ -49,7 +49,7 @@
 ruleOrdinalsFirst5 = Rule
   { name = "ordinals first"
   , pattern =
-    [ regex "(\x0633\x0627\x062f\x0633 | \x0633\x0627\x062f\x0633\x0629 | \x0627\x0644\x0633\x0627\x062f\x0633 | \x0627\x0644\x0633\x0627\x062f\x0633\x0629)"
+    [ regex "(سادس | سادسة | السادس | السادسة)"
     ]
   , prod = \_ -> Just $ ordinal 6
   }
@@ -58,7 +58,7 @@
 ruleOrdinalsTh2 = Rule
   { name = "ordinals 8th"
   , pattern =
-    [ regex "(\x062b\x0627\x0645\x0646 | \x062b\x0627\x0645\x0646\x0629 | \x0627\x0644\x062b\x0627\x0645\x0646 | \x0627\x0644\x062b\x0627\x0645\x0646\x0629)"
+    [ regex "(ثامن | ثامنة | الثامن | الثامنة)"
     ]
   , prod = \_ -> Just $ ordinal 8
   }
@@ -67,7 +67,7 @@
 ruleOrdinalsFirst2 = Rule
   { name = "ordinals first"
   , pattern =
-    [ regex "(\x062b\x0627\x0644\x062b|\x062b\x0627\x0644\x062b\x0629|\x0627\x0644\x062b\x0627\x0644\x062b|\x0627\x0644\x062b\x0627\x0644\x062b\x0629)"
+    [ regex "(ثالث|ثالثة|الثالث|الثالثة)"
     ]
   , prod = \_ -> Just $ ordinal 3
   }
@@ -76,7 +76,7 @@
 ruleOrdinalsTh4 = Rule
   { name = "ordinals 10th"
   , pattern =
-    [ regex "(\x0639\x0627\x0634\x0631 | \x0639\x0627\x0634\x0631\x0629 | \x0627\x0644\x0639\x0627\x0634\x0631 | \x0627\x0644\x0639\x0627\x0634\x0631\x0629)"
+    [ regex "(عاشر | عاشرة | العاشر | العاشرة)"
     ]
   , prod = \_ -> Just $ ordinal 10
   }
@@ -85,7 +85,7 @@
 ruleOrdinalsTh3 = Rule
   { name = "ordinals 9th"
   , pattern =
-    [ regex "(\x062a\x0627\x0633\x0639 | \x062a\x0627\x0633\x0639\x0629 | \x0627\x0644\x062a\x0627\x0633\x0639 | \x0627\x0644\x062a\x0627\x0633\x0639\x0629)"
+    [ regex "(تاسع | تاسعة | التاسع | التاسعة)"
     ]
   , prod = \_ -> Just $ ordinal 9
   }
@@ -94,7 +94,7 @@
 ruleOrdinalsFirst4 = Rule
   { name = "ordinals first"
   , pattern =
-    [ regex "(\x062e\x0627\x0645\x0633 | \x0627\x0644\x062e\x0627\x0645\x0633 | \x062e\x0627\x0645\x0633\x0629 | \x0627\x0644\x062e\x0627\x0645\x0633\x0629)"
+    [ regex "(خامس | الخامس | خامسة | الخامسة)"
     ]
   , prod = \_ -> Just $ ordinal 5
   }
@@ -103,7 +103,7 @@
 ruleOrdinalsFirst3 = Rule
   { name = "ordinals first"
   , pattern =
-    [ regex "(\x0631\x0627\x0628\x0639|\x0631\x0627\x0628\x0639\x0629 | \x0627\x0644\x0631\x0627\x0628\x0639|\x0627\x0644\x0631\x0627\x0628\x0639\x0629)"
+    [ regex "(رابع|رابعة | الرابع|الرابعة)"
     ]
   , prod = \_ -> Just $ ordinal 4
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = DA}, allExamples)
+corpus = (testContext {locale = makeLocale DA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/DA/Rules.hs b/Duckling/Ordinal/DA/Rules.hs
--- a/Duckling/Ordinal/DA/Rules.hs
+++ b/Duckling/Ordinal/DA/Rules.hs
@@ -26,11 +26,11 @@
 ruleOrdinalsFirstst = Rule
   { name = "ordinals (first..31st)"
   , pattern =
-    [ regex "(f\x00f8rste|anden|tredje|fjerde|femte|sjette|syvende|ottende|niende|tiende|elfte|tolvte|trettende|fjortende|femtende|sekstende|syttende|attende|nittende|tyvende|tenogtyvende|toogtyvende|treogtyvende|fireogtyvende|femogtyvende|seksogtyvende|syvogtyvende|otteogtyvende|niogtyvende|tredivte|enogtredivte)"
+    [ regex "(første|anden|tredje|fjerde|femte|sjette|syvende|ottende|niende|tiende|elfte|tolvte|trettende|fjortende|femtende|sekstende|syttende|attende|nittende|tyvende|tenogtyvende|toogtyvende|treogtyvende|fireogtyvende|femogtyvende|seksogtyvende|syvogtyvende|otteogtyvende|niogtyvende|tredivte|enogtredivte)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "f\x00f8rste" -> Just $ ordinal 1
+        "første" -> Just $ ordinal 1
         "anden" -> Just $ ordinal 2
         "tredje" -> Just $ ordinal 3
         "fjerde" -> Just $ ordinal 4
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
@@ -16,16 +16,16 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = DE}, allExamples)
+corpus = (testContext {locale = makeLocale DE Nothing}, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {lang = DE}, examples)
+negativeCorpus = (testContext {locale = makeLocale DE Nothing}, examples)
   where
     examples =
       [ "1.1"
diff --git a/Duckling/Ordinal/DE/Rules.hs b/Duckling/Ordinal/DE/Rules.hs
--- a/Duckling/Ordinal/DE/Rules.hs
+++ b/Duckling/Ordinal/DE/Rules.hs
@@ -26,7 +26,7 @@
 ruleOrdinalsFirstth = Rule
   { name = "ordinals (first..19th)"
   , pattern =
-    [ regex "(erste(r|s)?|zweite(r|s)|dritte(r|s)|vierte(r|s)|fuenfte(r|s)|sechste(r|s)|siebte(r|s)|achte(r|s)|neunte(r|s)|zehnte(r|s)|elfter|zw\x00f6lfter|dreizenter|vierzehnter|f\x00fcnfzehnter|sechzenter|siebzehnter|achtzehnter|neunzehnter)"
+    [ regex "(erste(r|s)?|zweite(r|s)|dritte(r|s)|vierte(r|s)|fuenfte(r|s)|sechste(r|s)|siebte(r|s)|achte(r|s)|neunte(r|s)|zehnte(r|s)|elfter|zwölfter|dreizenter|vierzehnter|fünfzehnter|sechzenter|siebzehnter|achtzehnter|neunzehnter)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -42,9 +42,9 @@
         "viertes" -> Just $ ordinal 4
         "vierte" -> Just $ ordinal 4
         "vierter" -> Just $ ordinal 4
-        "f\x00fcnftes" -> Just $ ordinal 5
-        "f\x00fcnfter" -> Just $ ordinal 5
-        "f\x00fcnfte" -> Just $ ordinal 5
+        "fünftes" -> Just $ ordinal 5
+        "fünfter" -> Just $ ordinal 5
+        "fünfte" -> Just $ ordinal 5
         "sechste" -> Just $ ordinal 6
         "sechstes" -> Just $ ordinal 6
         "sechster" -> Just $ ordinal 6
@@ -61,10 +61,10 @@
         "zehnter" -> Just $ ordinal 10
         "zehntes" -> Just $ ordinal 10
         "elfter" -> Just $ ordinal 11
-        "zw\x00f6lfter" -> Just $ ordinal 12
+        "zwölfter" -> Just $ ordinal 12
         "dreizehnter" -> Just $ ordinal 13
         "vierzehnter" -> Just $ ordinal 14
-        "f\x00fcnfzehnter" -> Just $ ordinal 15
+        "fünfzehnter" -> Just $ ordinal 15
         "sechzehnter" -> Just $ ordinal 16
         "siebzehnter" -> Just $ ordinal 17
         "achtzehnter" -> Just $ ordinal 18
diff --git a/Duckling/Ordinal/ES/Corpus.hs b/Duckling/Ordinal/ES/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/ES/Corpus.hs
@@ -0,0 +1,42 @@
+-- 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.ES.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 ES Nothing}, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "primer"
+             , "primero"
+             , "primeras"
+             ]
+  , examples (OrdinalData 2)
+             [ "segundo"
+             , "segunda"
+             , "segundos"
+             ]
+  , examples (OrdinalData 10)
+             [ "decimo"
+             , "decimas"
+             , "décimos"
+             ]
+  ]
diff --git a/Duckling/Ordinal/ES/Rules.hs b/Duckling/Ordinal/ES/Rules.hs
--- a/Duckling/Ordinal/ES/Rules.hs
+++ b/Duckling/Ordinal/ES/Rules.hs
@@ -50,13 +50,13 @@
   , ( "sexto" , 6 )
   , ( "sexta" , 6 )
   , ( "sextas" , 6 )
-  , ( "s\x00e9ptimas" , 7 )
+  , ( "séptimas" , 7 )
   , ( "septimas" , 7 )
-  , ( "s\x00e9ptima" , 7 )
+  , ( "séptima" , 7 )
   , ( "septimos" , 7 )
   , ( "septima" , 7 )
-  , ( "s\x00e9ptimo" , 7 )
-  , ( "s\x00e9ptimos" , 7 )
+  , ( "séptimo" , 7 )
+  , ( "séptimos" , 7 )
   , ( "septimo" , 7 )
   , ( "octavas" , 8 )
   , ( "octavo" , 8 )
@@ -66,21 +66,21 @@
   , ( "novena" , 9 )
   , ( "noveno" , 9 )
   , ( "novenas" , 9 )
-  , ( "d\x00e9cimos" , 10 )
+  , ( "décimos" , 10 )
   , ( "decimo" , 10 )
   , ( "decimos" , 10 )
-  , ( "d\x00e9cimo" , 10 )
+  , ( "décimo" , 10 )
   , ( "decimas" , 10 )
-  , ( "d\x00e9cima" , 10 )
+  , ( "décima" , 10 )
   , ( "decima" , 10 )
-  , ( "d\x00e9cimas" , 10 )
+  , ( "décimas" , 10 )
   ]
 
 ruleOrdinalsPrimero :: Rule
 ruleOrdinalsPrimero = Rule
   { name = "ordinals (primero..10)"
   , pattern =
-    [ regex "(primer|tercer(os?|as?)?|(primer|segund|cuart|quint|sext|s[e\x00e9]ptim|octav|noven|d[e\x00e9]cim)(os?|as?))"
+    [ regex "((primer|segund|cuart|quint|sext|s[eé]ptim|octav|noven|d[eé]cim)(os?|as?)|(prim|terc)er)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ET}, allExamples)
+corpus = (testContext {locale = makeLocale ET Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/ET/Rules.hs b/Duckling/Ordinal/ET/Rules.hs
--- a/Duckling/Ordinal/ET/Rules.hs
+++ b/Duckling/Ordinal/ET/Rules.hs
@@ -26,7 +26,7 @@
 ruleOrdinalsFirstth = Rule
   { name = "ordinals (first..19th)"
   , pattern =
-    [ regex "(esimene|teine|kolmas|neljas|viies|kuues|seitsmes|kaheksas|\x00fcheksas|k\x00fcmnes|\x00fcheteistk\x00fcmnes|kaheteistk\x00fcmnes|kolmeteistk\x00fcmnes|neljateistk\x00fcmnes|viieteistk\x00fcmnes|kuueteistk\x00fcmnes|seitsmeteistk\x00fcmnes|kaheksateistk\x00fcmnes|\x00fcheksateistk\x00fcmnes)"
+    [ regex "(esimene|teine|kolmas|neljas|viies|kuues|seitsmes|kaheksas|üheksas|kümnes|üheteistkümnes|kaheteistkümnes|kolmeteistkümnes|neljateistkümnes|viieteistkümnes|kuueteistkümnes|seitsmeteistkümnes|kaheksateistkümnes|üheksateistkümnes)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -38,17 +38,17 @@
         "kuues" -> Just $ ordinal 6
         "seitsmes" -> Just $ ordinal 7
         "kaheksas" -> Just $ ordinal 8
-        "\x00fcheksas" -> Just $ ordinal 9
-        "k\x00fcmnes" -> Just $ ordinal 10
-        "\x00fcheteistk\x00fcmnes" -> Just $ ordinal 11
-        "kaheteistk\x00fcmnes" -> Just $ ordinal 12
-        "kolmeteistk\x00fcmnes" -> Just $ ordinal 13
-        "neljateistk\x00fcmnes" -> Just $ ordinal 14
-        "viieteistk\x00fcmnes" -> Just $ ordinal 15
-        "kuueteistk\x00fcmnes" -> Just $ ordinal 16
-        "seitsmeteistk\x00fcmnes" -> Just $ ordinal 17
-        "kaheksateistk\x00fcmnes" -> Just $ ordinal 18
-        "\x00fcheksateistk\x00fcmnes" -> Just $ ordinal 19
+        "üheksas" -> Just $ ordinal 9
+        "kümnes" -> Just $ ordinal 10
+        "üheteistkümnes" -> Just $ ordinal 11
+        "kaheteistkümnes" -> Just $ ordinal 12
+        "kolmeteistkümnes" -> Just $ ordinal 13
+        "neljateistkümnes" -> Just $ ordinal 14
+        "viieteistkümnes" -> Just $ ordinal 15
+        "kuueteistkümnes" -> Just $ ordinal 16
+        "seitsmeteistkümnes" -> Just $ ordinal 17
+        "kaheksateistkümnes" -> Just $ ordinal 18
+        "üheksateistkümnes" -> Just $ ordinal 19
         _ -> Nothing
       _ -> Nothing
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/FR/Rules.hs b/Duckling/Ordinal/FR/Rules.hs
--- a/Duckling/Ordinal/FR/Rules.hs
+++ b/Duckling/Ordinal/FR/Rules.hs
@@ -27,48 +27,48 @@
 
 ruleOrdinalsPremierseiziemeMap :: HashMap Text Int
 ruleOrdinalsPremierseiziemeMap = HashMap.fromList
-  [ ( "premi\x00e8re"   , 1 )
+  [ ( "première"   , 1 )
   , ( "premiere"        , 1 )
   , ( "premier"         , 1 )
-  , ( "deuxi\x00e8me"   , 2 )
+  , ( "deuxième"   , 2 )
   , ( "deuxieme"        , 2 )
   , ( "second"          , 2 )
   , ( "seconde"         , 2 )
-  , ( "troisi\x00e8me"  , 3 )
+  , ( "troisième"  , 3 )
   , ( "troisieme"       , 3 )
   , ( "quatrieme"       , 4 )
-  , ( "quatri\x00e8me"  , 4 )
+  , ( "quatrième"  , 4 )
   , ( "cinquieme"       , 5 )
-  , ( "cinqui\x00e8me"  , 5 )
-  , ( "sixi\x00e8me"    , 6 )
+  , ( "cinquième"  , 5 )
+  , ( "sixième"    , 6 )
   , ( "sixieme"         , 6 )
   , ( "septieme"        , 7 )
-  , ( "septi\x00e8me"   , 7 )
-  , ( "huiti\x00e8me"   , 8 )
+  , ( "septième"   , 7 )
+  , ( "huitième"   , 8 )
   , ( "huitieme"        , 8 )
   , ( "neuvieme"        , 9 )
-  , ( "neuvi\x00e8me"   , 9 )
-  , ( "dixi\x00e8me"    , 10 )
+  , ( "neuvième"   , 9 )
+  , ( "dixième"    , 10 )
   , ( "dixieme"         , 10 )
-  , ( "onzi\x00e8me"    , 11 )
+  , ( "onzième"    , 11 )
   , ( "onzieme"         , 11 )
   , ( "douzieme"        , 12 )
-  , ( "douzi\x00e8me"   , 12 )
+  , ( "douzième"   , 12 )
   , ( "treizieme"       , 13 )
-  , ( "treizi\x00e8me"  , 13 )
-  , ( "quatorzi\x00e8me", 14 )
+  , ( "treizième"  , 13 )
+  , ( "quatorzième", 14 )
   , ( "quatorzieme"     , 14 )
-  , ( "quinzi\x00e8me"  , 15 )
+  , ( "quinzième"  , 15 )
   , ( "quinzieme"       , 15 )
   , ( "seizieme"        , 16 )
-  , ( "seizi\x00e8me"   , 16 )
+  , ( "seizième"   , 16 )
   ]
 
 ruleOrdinalsPremierseizieme :: Rule
 ruleOrdinalsPremierseizieme = Rule
   { name = "ordinals (premier..seizieme)"
   , pattern =
-    [ regex "(premi(ere?|\x00e8re)|(deux|trois|quatr|cinqu|six|sept|huit|neuv|dix|onz|douz|treiz|quatorz|quinz|seiz)i(e|\x00e8)me|seconde?)"
+    [ regex "(premi(ere?|ère)|(deux|trois|quatr|cinqu|six|sept|huit|neuv|dix|onz|douz|treiz|quatorz|quinz|seiz)i(e|è)me|seconde?)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -80,7 +80,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "0*(\\d+) ?(ere?|\x00e8re|\x00e8me|eme|e)"
+    [ regex "0*(\\d+) ?(ere?|ère|ème|eme|e)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/GA/Rules.hs b/Duckling/Ordinal/GA/Rules.hs
--- a/Duckling/Ordinal/GA/Rules.hs
+++ b/Duckling/Ordinal/GA/Rules.hs
@@ -26,79 +26,79 @@
 ruleOrdinalsChadDaraEtc = Rule
   { name = "ordinals (chéad, dara, etc.)"
   , pattern =
-    [ regex "(ch(\x00e9|e)ad|aon(\x00fa|u)|t-aon(\x00fa|u)|dara|tr(\x00ed|i)(\x00fa|u)|ceathr(\x00fa|u)|c(\x00fa|u)igi(\x00fa|u)|s(\x00e9|e)(\x00fa|u)|seacht(\x00fa|u)|ocht(\x00fa|u)|t-ocht(\x00fa|u)|nao(\x00fa|u)|deichi(\x00fa|u)|fichi(\x00fa|u)|tr(\x00ed|i)ochad(\x00fa|u)|daichead(\x00fa|u)|caogad(\x00fa|u)|seascad(\x00fa|u)|seacht(\x00f3|o)d(\x00fa|u)|ocht(\x00f3|o)d(\x00fa|u)|t-ocht(\x00f3|o)d(\x00fa|u)|n(\x00f3|o)chad(\x00fa|u)|c(\x00e9|e)ad(\x00fa|u)|mili(\x00fa|u)|milli(\x00fa|u)n(\x00fa|u))"
+    [ regex "(ch(é|e)ad|aon(ú|u)|t-aon(ú|u)|dara|tr(í|i)(ú|u)|ceathr(ú|u)|c(ú|u)igi(ú|u)|s(é|e)(ú|u)|seacht(ú|u)|ocht(ú|u)|t-ocht(ú|u)|nao(ú|u)|deichi(ú|u)|fichi(ú|u)|tr(í|i)ochad(ú|u)|daichead(ú|u)|caogad(ú|u)|seascad(ú|u)|seacht(ó|o)d(ú|u)|ocht(ó|o)d(ú|u)|t-ocht(ó|o)d(ú|u)|n(ó|o)chad(ú|u)|c(é|e)ad(ú|u)|mili(ú|u)|milli(ú|u)n(ú|u))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
         "t-aonu" -> Just $ ordinal 1
         "aonu" -> Just $ ordinal 1
-        "aon\x00fa" -> Just $ ordinal 1
-        "ch\x00e9ad" -> Just $ ordinal 1
+        "aonú" -> Just $ ordinal 1
+        "chéad" -> Just $ ordinal 1
         "chead" -> Just $ ordinal 1
-        "t-aon\x00fa" -> Just $ ordinal 1
+        "t-aonú" -> Just $ ordinal 1
         "dara" -> Just $ ordinal 2
-        "tri\x00fa" -> Just $ ordinal 3
-        "tr\x00edu" -> Just $ ordinal 3
-        "tr\x00ed\x00fa" -> Just $ ordinal 3
+        "triú" -> Just $ ordinal 3
+        "tríu" -> Just $ ordinal 3
+        "tríú" -> Just $ ordinal 3
         "triu" -> Just $ ordinal 3
-        "ceathr\x00fa" -> Just $ ordinal 4
+        "ceathrú" -> Just $ ordinal 4
         "ceathru" -> Just $ ordinal 4
-        "c\x00faigiu" -> Just $ ordinal 5
-        "c\x00faigi\x00fa" -> Just $ ordinal 5
+        "cúigiu" -> Just $ ordinal 5
+        "cúigiú" -> Just $ ordinal 5
         "cuigiu" -> Just $ ordinal 5
-        "cuigi\x00fa" -> Just $ ordinal 5
-        "s\x00e9u" -> Just $ ordinal 6
-        "s\x00e9\x00fa" -> Just $ ordinal 6
+        "cuigiú" -> Just $ ordinal 5
+        "séu" -> Just $ ordinal 6
+        "séú" -> Just $ ordinal 6
         "seu" -> Just $ ordinal 6
-        "se\x00fa" -> Just $ ordinal 6
+        "seú" -> Just $ ordinal 6
         "seachtu" -> Just $ ordinal 7
-        "seacht\x00fa" -> Just $ ordinal 7
-        "t-ocht\x00fa" -> Just $ ordinal 8
+        "seachtú" -> Just $ ordinal 7
+        "t-ochtú" -> Just $ ordinal 8
         "ochtu" -> Just $ ordinal 8
         "t-ochtu" -> Just $ ordinal 8
-        "ocht\x00fa" -> Just $ ordinal 8
+        "ochtú" -> Just $ ordinal 8
         "naou" -> Just $ ordinal 9
-        "nao\x00fa" -> Just $ ordinal 9
+        "naoú" -> Just $ ordinal 9
         "deichiu" -> Just $ ordinal 10
-        "deichi\x00fa" -> Just $ ordinal 10
+        "deichiú" -> Just $ ordinal 10
         "fichiu" -> Just $ ordinal 20
-        "fichi\x00fa" -> Just $ ordinal 20
-        "tr\x00edochadu" -> Just $ ordinal 30
+        "fichiú" -> Just $ ordinal 20
+        "tríochadu" -> Just $ ordinal 30
         "triochadu" -> Just $ ordinal 30
-        "tr\x00edochad\x00fa" -> Just $ ordinal 30
-        "triochad\x00fa" -> Just $ ordinal 30
-        "daichead\x00fa" -> Just $ ordinal 40
+        "tríochadú" -> Just $ ordinal 30
+        "triochadú" -> Just $ ordinal 30
+        "daicheadú" -> Just $ ordinal 40
         "daicheadu" -> Just $ ordinal 40
         "caogadu" -> Just $ ordinal 50
-        "caogad\x00fa" -> Just $ ordinal 50
+        "caogadú" -> Just $ ordinal 50
         "seascadu" -> Just $ ordinal 60
-        "seascad\x00fa" -> Just $ ordinal 60
+        "seascadú" -> Just $ ordinal 60
         "seachtodu" -> Just $ ordinal 70
-        "seachtod\x00fa" -> Just $ ordinal 70
-        "seacht\x00f3d\x00fa" -> Just $ ordinal 70
-        "seacht\x00f3du" -> Just $ ordinal 70
-        "ocht\x00f3du" -> Just $ ordinal 80
+        "seachtodú" -> Just $ ordinal 70
+        "seachtódú" -> Just $ ordinal 70
+        "seachtódu" -> Just $ ordinal 70
+        "ochtódu" -> Just $ ordinal 80
         "ochtodu" -> Just $ ordinal 80
         "t-ochtodu" -> Just $ ordinal 80
-        "t-ocht\x00f3d\x00fa" -> Just $ ordinal 80
-        "t-ochtod\x00fa" -> Just $ ordinal 80
-        "ocht\x00f3d\x00fa" -> Just $ ordinal 80
-        "t-ocht\x00f3du" -> Just $ ordinal 80
-        "ochtod\x00fa" -> Just $ ordinal 80
-        "n\x00f3chad\x00fa" -> Just $ ordinal 90
-        "n\x00f3chadu" -> Just $ ordinal 90
-        "nochad\x00fa" -> Just $ ordinal 90
+        "t-ochtódú" -> Just $ ordinal 80
+        "t-ochtodú" -> Just $ ordinal 80
+        "ochtódú" -> Just $ ordinal 80
+        "t-ochtódu" -> Just $ ordinal 80
+        "ochtodú" -> Just $ ordinal 80
+        "nóchadú" -> Just $ ordinal 90
+        "nóchadu" -> Just $ ordinal 90
+        "nochadú" -> Just $ ordinal 90
         "nochadu" -> Just $ ordinal 90
-        "c\x00e9ad\x00fa" -> Just $ ordinal 100
-        "cead\x00fa" -> Just $ ordinal 100
+        "céadú" -> Just $ ordinal 100
+        "ceadú" -> Just $ ordinal 100
         "ceadu" -> Just $ ordinal 100
-        "c\x00e9adu" -> Just $ ordinal 100
+        "céadu" -> Just $ ordinal 100
         "miliu" -> Just $ ordinal 1000
-        "mili\x00fa" -> Just $ ordinal 1000
-        "milliun\x00fa" -> Just $ ordinal 1000000
+        "miliú" -> Just $ ordinal 1000
+        "milliunú" -> Just $ ordinal 1000000
         "milliunu" -> Just $ ordinal 1000000
-        "milli\x00fanu" -> Just $ ordinal 1000000
-        "milli\x00fan\x00fa" -> Just $ ordinal 1000000
+        "milliúnu" -> Just $ ordinal 1000000
+        "milliúnú" -> Just $ ordinal 1000000
         _ -> Nothing
       _ -> Nothing
   }
@@ -107,7 +107,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "0*(\\d+) ?(adh|a|d|\x00fa|u)"
+    [ regex "0*(\\d+) ?(adh|a|d|ú|u)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HE}, allExamples)
+corpus = (testContext {locale = makeLocale HE Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/HE/Rules.hs b/Duckling/Ordinal/HE/Rules.hs
--- a/Duckling/Ordinal/HE/Rules.hs
+++ b/Duckling/Ordinal/HE/Rules.hs
@@ -29,7 +29,7 @@
 ruleOrdinal4 = Rule
   { name = "ordinal 4"
   , pattern =
-    [ regex "(\x05d0\x05e8\x05d1\x05e2\x05d4|\x05e8\x05d1\x05d9\x05e2\x05d9)"
+    [ regex "(ארבעה|רביעי)"
     ]
   , prod = \_ -> Just $ ordinal 4
   }
@@ -38,7 +38,7 @@
 ruleOrdinal9 = Rule
   { name = "ordinal 9"
   , pattern =
-    [ regex "(\x05ea\x05e9\x05e2\x05d4|\x05ea\x05e9\x05d9\x05e2\x05d9)"
+    [ regex "(תשעה|תשיעי)"
     ]
   , prod = \_ -> Just $ ordinal 9
   }
@@ -47,7 +47,7 @@
 ruleOrdinal10 = Rule
   { name = "ordinal 10"
   , pattern =
-    [ regex "(\x05e2\x05e9\x05e8\x05d4|\x05e2\x05e9\x05d9\x05e8\x05d9)"
+    [ regex "(עשרה|עשירי)"
     ]
   , prod = \_ -> Just $ ordinal 10
   }
@@ -56,7 +56,7 @@
 ruleOrdinal12 = Rule
   { name = "ordinal 12"
   , pattern =
-    [ regex "(\x05e9\x05e0\x05d9\x05d9\x05dd \x05e2\x05e9\x05e8|\x05ea\x05e8\x05d9 \x05e2\x05e9\x05e8)"
+    [ regex "(שניים עשר|תרי עשר)"
     ]
   , prod = \_ -> Just $ ordinal 12
   }
@@ -65,7 +65,7 @@
 ruleOrdinal17 = Rule
   { name = "ordinal 17"
   , pattern =
-    [ regex "(\x05e9\x05d1\x05e2(\x05d4)? \x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(שבע(ה)? עשר(ה)?)"
     ]
   , prod = \_ -> Just $ ordinal 17
   }
@@ -74,7 +74,7 @@
 ruleOrdinal18 = Rule
   { name = "ordinal 18"
   , pattern =
-    [ regex "(\x05e9\x05de\x05d5\x05e0\x05d4 \x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(שמונה עשר(ה)?)"
     ]
   , prod = \_ -> Just $ ordinal 18
   }
@@ -94,7 +94,7 @@
 ruleOrdinal15 = Rule
   { name = "ordinal 15"
   , pattern =
-    [ regex "(\x05d7\x05de\x05d9\x05e9\x05d4 \x05e2\x05e9\x05e8|\x05d7\x05de\x05e9 \x05e2\x05e9\x05e8\x05d4?)"
+    [ regex "(חמישה עשר|חמש עשרה?)"
     ]
   , prod = \_ -> Just $ ordinal 15
   }
@@ -103,7 +103,7 @@
 ruleOrdinal5 = Rule
   { name = "ordinal 5"
   , pattern =
-    [ regex "(\x05d7\x05de\x05d9\x05e9\x05d9|\x05d7\x05de\x05d9\x05e9\x05d4)"
+    [ regex "(חמישי|חמישה)"
     ]
   , prod = \_ -> Just $ ordinal 5
   }
@@ -112,7 +112,7 @@
 ruleOrdinal16 = Rule
   { name = "ordinal 16"
   , pattern =
-    [ regex "(\x05e9\x05e9(\x05d4)? \x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(שש(ה)? עשר(ה)?)"
     ]
   , prod = \_ -> Just $ ordinal 16
   }
@@ -121,7 +121,7 @@
 ruleOrdinal14 = Rule
   { name = "ordinal 14"
   , pattern =
-    [ regex "(\x05d0\x05e8\x05d1\x05e2(\x05d4)? \x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(ארבע(ה)? עשר(ה)?)"
     ]
   , prod = \_ -> Just $ ordinal 14
   }
@@ -130,18 +130,18 @@
 ruleOrdinal20 = Rule
   { name = "ordinal 20..90"
   , pattern =
-    [ regex "(\x05e2\x05e9\x05e8\x05d9\x05dd|\x05e9\x05dc\x05d5\x05e9\x05d9\x05dd|\x05d0\x05e8\x05d1\x05e2\x05d9\x05dd|\x05d7\x05de\x05d9\x05e9\x05d9\x05dd|\x05e9\x05d9\x05e9\x05d9\x05dd|\x05e9\x05d1\x05e2\x05d9\x05dd|\x05e9\x05de\x05d5\x05e0\x05d9\x05dd|\x05ea\x05e9\x05e2\x05d9\x05dd)"
+    [ regex "(עשרים|שלושים|ארבעים|חמישים|שישים|שבעים|שמונים|תשעים)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x05e2\x05e9\x05e8\x05d9\x05dd" -> Just $ ordinal 20
-        "\x05e9\x05dc\x05d5\x05e9\x05d9\x05dd" -> Just $ ordinal 30
-        "\x05d0\x05e8\x05d1\x05e2\x05d9\x05dd" -> Just $ ordinal 40
-        "\x05d7\x05de\x05d9\x05e9\x05d9\x05dd" -> Just $ ordinal 50
-        "\x05e9\x05d9\x05e9\x05d9\x05dd" -> Just $ ordinal 60
-        "\x05e9\x05d1\x05e2\x05d9\x05dd" -> Just $ ordinal 70
-        "\x05e9\x05de\x05d5\x05e0\x05d9\x05dd" -> Just $ ordinal 80
-        "\x05ea\x05e9\x05e2\x05d9\x05dd" -> Just $ ordinal 90
+        "עשרים" -> Just $ ordinal 20
+        "שלושים" -> Just $ ordinal 30
+        "ארבעים" -> Just $ ordinal 40
+        "חמישים" -> Just $ ordinal 50
+        "שישים" -> Just $ ordinal 60
+        "שבעים" -> Just $ ordinal 70
+        "שמונים" -> Just $ ordinal 80
+        "תשעים" -> Just $ ordinal 90
         _ -> Nothing
       _ -> Nothing
   }
@@ -150,7 +150,7 @@
 ruleOrdinal = Rule
   { name = "ordinal 1"
   , pattern =
-    [ regex "(\x05d0\x05d7\x05d3|\x05e8\x05d0\x05e9\x05d5\x05df)"
+    [ regex "(אחד|ראשון)"
     ]
   , prod = \_ -> Just $ ordinal 1
   }
@@ -159,7 +159,7 @@
 ruleOrdinal13 = Rule
   { name = "ordinal 13"
   , pattern =
-    [ regex "(\x05e9\x05dc\x05d5\x05e9(\x05d4)? \x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(שלוש(ה)? עשר(ה)?)"
     ]
   , prod = \_ -> Just $ ordinal 13
   }
@@ -168,7 +168,7 @@
 ruleOrdinal7 = Rule
   { name = "ordinal 7"
   , pattern =
-    [ regex "(\x05e9\x05d1\x05e2\x05d4|\x05e9\x05d1\x05d9\x05e2\x05d9)"
+    [ regex "(שבעה|שביעי)"
     ]
   , prod = \_ -> Just $ ordinal 7
   }
@@ -177,7 +177,7 @@
 ruleOrdinal8 = Rule
   { name = "ordinal 8"
   , pattern =
-    [ regex "(\x05e9\x05de\x05d5\x05e0\x05d4|\x05e9\x05de\x05d9\x05e0\x05d9)"
+    [ regex "(שמונה|שמיני)"
     ]
   , prod = \_ -> Just $ ordinal 8
   }
@@ -186,7 +186,7 @@
 ruleOrdinal2 = Rule
   { name = "ordinal 2"
   , pattern =
-    [ regex "(\x05e9\x05ea\x05d9\x05d9\x05dd|\x05e9\x05e0\x05d9\x05d9\x05dd|\x05e9\x05e0\x05d9)"
+    [ regex "(שתיים|שניים|שני)"
     ]
   , prod = \_ -> Just $ ordinal 2
   }
@@ -195,7 +195,7 @@
 ruleOrdinal11 = Rule
   { name = "ordinal 11"
   , pattern =
-    [ regex "(\x05d0\x05d7\x05d3 \x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(אחד עשר(ה)?)"
     ]
   , prod = \_ -> Just $ ordinal 11
   }
@@ -204,7 +204,7 @@
 ruleOrdinal3 = Rule
   { name = "ordinal 3"
   , pattern =
-    [ regex "(\x05e9\x05dc\x05d5\x05e9\x05d4|\x05e9\x05dc\x05d9\x05e9\x05d9)"
+    [ regex "(שלושה|שלישי)"
     ]
   , prod = \_ -> Just $ ordinal 3
   }
@@ -213,7 +213,7 @@
 ruleOrdinal6 = Rule
   { name = "ordinal 6"
   , pattern =
-    [ regex "(\x05e9\x05e9\x05d4|\x05e9\x05d9\x05e9\x05d9)"
+    [ regex "(ששה|שישי)"
     ]
   , prod = \_ -> Just $ ordinal 6
   }
@@ -222,7 +222,7 @@
 ruleOrdinal19 = Rule
   { name = "ordinal 19"
   , pattern =
-    [ regex "(\x05ea\x05e9\x05e2(\x05d4)? \x05e2\x05e9\x05e8(\x05d4)?)"
+    [ regex "(תשע(ה)? עשר(ה)?)"
     ]
   , prod = \_ -> Just $ ordinal 19
   }
@@ -232,7 +232,7 @@
   { name = "ordinal composition (with and)"
   , pattern =
     [ dimension Ordinal
-    , regex "\x05d5"
+    , regex "ו"
     , dimension Ordinal
     ]
   , prod = \tokens -> case tokens of
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/HR/Rules.hs b/Duckling/Ordinal/HR/Rules.hs
--- a/Duckling/Ordinal/HR/Rules.hs
+++ b/Duckling/Ordinal/HR/Rules.hs
@@ -152,7 +152,7 @@
 ruleOrdinalsFirstth = Rule
   { name = "ordinals (first..19th)"
   , pattern =
-    [ regex "(prv(i|a|o(ga?)?)|drug(i|a|o(ga?)?)|tre(c|\x0107)(i|a|e(ga?)?)|(\x010d|c)etvrt(i|a|o(ga?)?)|pet(i|a|o(ga?)?)|(\x0161|s)est(i|a|o(ga?)?)|sedm(i|a|o(ga?)?)|osm(i|a|o(ga?)?)|devet(i|a|o(ga?)?)|deset(i|a|o(ga?)?)|jedanaest(i|a|o(ga?)?)|dvanaest(i|a|o(ga?)?)|trinaest(i|a|o(ga?)?)|(c|\x010d)etrnaest(i|a|o(ga?)?)|petnaest(i|a|o(ga?)?)|(s|\x0161)esnaest(i|a|o(ga?)?)|sedamnaest(i|a|o(ga?)?)|osamnaest(i|a|o(ga?)?)|devetnaest(i|a|o(ga?)?))"
+    [ regex "(prv(i|a|o(ga?)?)|drug(i|a|o(ga?)?)|tre(c|ć)(i|a|e(ga?)?)|(č|c)etvrt(i|a|o(ga?)?)|pet(i|a|o(ga?)?)|(š|s)est(i|a|o(ga?)?)|sedm(i|a|o(ga?)?)|osm(i|a|o(ga?)?)|devet(i|a|o(ga?)?)|deset(i|a|o(ga?)?)|jedanaest(i|a|o(ga?)?)|dvanaest(i|a|o(ga?)?)|trinaest(i|a|o(ga?)?)|(c|č)etrnaest(i|a|o(ga?)?)|petnaest(i|a|o(ga?)?)|(s|š)esnaest(i|a|o(ga?)?)|sedamnaest(i|a|o(ga?)?)|osamnaest(i|a|o(ga?)?)|devetnaest(i|a|o(ga?)?))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
diff --git a/Duckling/Ordinal/HU/Corpus.hs b/Duckling/Ordinal/HU/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/HU/Corpus.hs
@@ -0,0 +1,67 @@
+-- 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.HU.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 HU Nothing}, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "első"
+             , "1."
+             ]
+  , examples (OrdinalData 2)
+             [ "második"
+             , "2."
+             ]
+  , examples (OrdinalData 3)
+             [ "harmadik"
+             , "3."
+             ]
+  , examples (OrdinalData 4)
+             [ "negyedik"
+             , "4."
+             ]
+  , examples (OrdinalData 8)
+             [ "nyolcadik"
+             , "8."
+             ]
+  , examples (OrdinalData 25)
+             [ "huszonötödik"
+             , "25."
+             ]
+  , examples (OrdinalData 31)
+             [ "harmincegyedik"
+             , "31."
+             ]
+  , examples (OrdinalData 42)
+             [ "negyvenkettedik"
+             , "42."
+             ]
+  , examples (OrdinalData 77)
+            [ "hetvenhetedik"
+            , "77."
+            ]
+  , examples (OrdinalData 90)
+            [ "kilencvenedik"
+            , "90."
+            ]
+  ]
diff --git a/Duckling/Ordinal/HU/Rules.hs b/Duckling/Ordinal/HU/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/HU/Rules.hs
@@ -0,0 +1,119 @@
+-- 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.Ordinal.HU.Rules
+  ( rules ) where
+
+import Control.Monad (join)
+import Data.HashMap.Strict ( HashMap)
+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 (parseInt)
+import Duckling.Ordinal.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ordinalsMap :: HashMap Text Int
+ordinalsMap = HashMap.fromList
+  [ ( "első", 1 )
+  , ( "második", 2 )
+  , ( "harmadik", 3 )
+  , ( "negyedik", 4 )
+  , ( "ötödik", 5 )
+  , ( "hatodik", 6 )
+  , ( "hetedik", 7 )
+  , ( "nyolcadik", 8 )
+  , ( "kilencedik", 9 )
+  , ( "tizedik", 10 )
+  , ( "huszadik", 20 )
+  , ( "harmincadik", 30 )
+  , ( "negyvenedik", 40 )
+  , ( "ötvenedik", 50 )
+  , ( "hatvanadik", 60 )
+  , ( "hetvenedik", 70 )
+  , ( "nyolcvanadik", 80 )
+  , ( "kilencvenedik", 90 )
+  ]
+
+ordinalsMap2 :: HashMap Text Int
+ordinalsMap2 = HashMap.fromList
+    [ ( "egyedik", 1 )
+    , ( "kettedik", 2 )
+    , ( "harmadik", 3 )
+    , ( "negyedik", 4 )
+    , ( "ötödik", 5 )
+    , ( "hatodik", 6 )
+    , ( "hetedik", 7 )
+    , ( "nyolcadik", 8 )
+    , ( "kilencedik", 9 )
+    ]
+
+cardinalsMap :: HashMap Text Int
+cardinalsMap = HashMap.fromList
+  [ ( "tizen", 10 )
+  , ( "huszon", 20 )
+  , ( "harminc", 30 )
+  , ( "negyven", 40 )
+  , ( "ötven", 50 )
+  , ( "hatvan", 60 )
+  , ( "hetven", 70 )
+  , ( "nyolcvan", 80 )
+  , ( "kilencven", 90 )
+  ]
+
+ruleOrdinals :: Rule
+ruleOrdinals = Rule
+  { name = "ordinals (first..twentieth,thirtieth,...)"
+  , pattern =
+    [ regex "(első|második|harmadik|negyedik|ötödik|hatodik|hetedik|nyolcadik|kilencedik|tizedik|huszadik|harmincadik|negyvenedik|ötvenedik|hatvanadik|hetvenedik|nyolcvanadik|kilencvenedik)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
+      _ -> Nothing
+    }
+
+ruleCompositeOrdinals :: Rule
+ruleCompositeOrdinals = Rule
+  { name = "ordinals (composite, e.g., eighty-seven)"
+  , pattern =
+    [ regex "(tizen|huszon|harminc|negyven|ötven|hatvan|hetven|nyolcvan|kilencven)\\-?(egyedik|kettedik|harmadik|negyedik|ötödik|hatodik|hetedik|nyolcadik|kilencedik)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (tens:units:_)):_) -> do
+        tt <- HashMap.lookup (Text.toLower tens) cardinalsMap
+        uu <- HashMap.lookup (Text.toLower units) ordinalsMap2
+        Just . ordinal $ tt + uu
+      _ -> 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 =
+  [ ruleOrdinals
+  , ruleCompositeOrdinals
+  , ruleOrdinalDigits
+  ]
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ID}, allExamples)
+corpus = (testContext {locale = makeLocale ID Nothing}, 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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = IT}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/IT/Rules.hs b/Duckling/Ordinal/IT/Rules.hs
--- a/Duckling/Ordinal/IT/Rules.hs
+++ b/Duckling/Ordinal/IT/Rules.hs
@@ -78,7 +78,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "0*(\\d+) ?(\x00aa|\x00b0|\x00b0)"
+    [ regex "0*(\\d+) ?(ª|°|°)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = JA}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/JA/Rules.hs b/Duckling/Ordinal/JA/Rules.hs
--- a/Duckling/Ordinal/JA/Rules.hs
+++ b/Duckling/Ordinal/JA/Rules.hs
@@ -25,7 +25,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "\x7b2c"
+    [ regex "第"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/KO/Rules.hs b/Duckling/Ordinal/KO/Rules.hs
--- a/Duckling/Ordinal/KO/Rules.hs
+++ b/Duckling/Ordinal/KO/Rules.hs
@@ -26,7 +26,7 @@
   { name = "ordinals (첫번째)"
   , pattern =
     [ dimension Numeral
-    , regex "\xbc88\xc9f8|\xc9f8(\xbc88)?"
+    , regex "번째|째(번)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral (NumeralData {TNumeral.value = v}):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = NB}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/NB/Rules.hs b/Duckling/Ordinal/NB/Rules.hs
--- a/Duckling/Ordinal/NB/Rules.hs
+++ b/Duckling/Ordinal/NB/Rules.hs
@@ -26,18 +26,18 @@
 ruleOrdinalsFirstst = Rule
   { name = "ordinals (first..31st)"
   , pattern =
-    [ regex "(f\x00f8rste|andre|tredje|fjerde|femtende|femte|sjette|syvende|\x00e5ttende|niende|tiende|ellevte|tolvte|trettende|fjortende|sekstende|syttende|attende|nittende|tyvende|tjuende|enogtyvende|toogtyvende|treogtyvende|fireogtyvende|femogtyvende|seksogtyvende|syvogtyvende|\x00e5tteogtyvende|niogtyvende|enogtjuende|toogtjuende|treogtjuende|fireogtjuende|femogtjuende|seksogtjuende|syvogtjuende|\x00e5tteogtyvend|niogtjuende|tredefte|enogtredefte)"
+    [ regex "(første|andre|tredje|fjerde|femtende|femte|sjette|syvende|åttende|niende|tiende|ellevte|tolvte|trettende|fjortende|sekstende|syttende|attende|nittende|tyvende|tjuende|enogtyvende|toogtyvende|treogtyvende|fireogtyvende|femogtyvende|seksogtyvende|syvogtyvende|åtteogtyvende|niogtyvende|enogtjuende|toogtjuende|treogtjuende|fireogtjuende|femogtjuende|seksogtjuende|syvogtjuende|åtteogtyvend|niogtjuende|tredefte|enogtredefte)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "f\x00f8rste" -> Just $ ordinal 1
+        "første" -> Just $ ordinal 1
         "andre" -> Just $ ordinal 2
         "tredje" -> Just $ ordinal 3
         "fjerde" -> Just $ ordinal 4
         "femte" -> Just $ ordinal 5
         "sjette" -> Just $ ordinal 6
         "syvende" -> Just $ ordinal 7
-        "\x00e5ttende" -> Just $ ordinal 8
+        "åttende" -> Just $ ordinal 8
         "niende" -> Just $ ordinal 9
         "tiende" -> Just $ ordinal 10
         "ellevte" -> Just $ ordinal 11
@@ -65,8 +65,8 @@
         "seksogtyvende" -> Just $ ordinal 26
         "syvogtyvende" -> Just $ ordinal 27
         "syvogtjuende" -> Just $ ordinal 27
-        "\x00e5tteogtyvende" -> Just $ ordinal 28
-        "\x00e5tteogtjuende" -> Just $ ordinal 28
+        "åtteogtyvende" -> Just $ ordinal 28
+        "åtteogtjuende" -> Just $ ordinal 28
         "niogtyvende" -> Just $ ordinal 29
         "niogtjuende" -> Just $ ordinal 29
         "tredefte" -> Just $ ordinal 30
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = NL}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, 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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PL}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/PL/Rules.hs b/Duckling/Ordinal/PL/Rules.hs
--- a/Duckling/Ordinal/PL/Rules.hs
+++ b/Duckling/Ordinal/PL/Rules.hs
@@ -27,7 +27,7 @@
 ruleThOrdinalNoSpace = Rule
   { name = "24th ordinal no space"
   , pattern =
-    [ regex "dwudziest(ym|y|ego|emu|(a|\x0105)|ej)czwart(y|ego|emu|ym|(a|\x0105)|ej)"
+    [ regex "dwudziest(ym|y|ego|emu|(a|ą)|ej)czwart(y|ego|emu|ym|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 24
   }
@@ -36,7 +36,7 @@
 ruleThOrdinal16 = Rule
   { name = "31-39th ordinal"
   , pattern =
-    [ regex "trzydziest(ym|y|ego|emu|(a|\x0105)|ej)( |-)?"
+    [ regex "trzydziest(ym|y|ego|emu|(a|ą)|ej)( |-)?"
     , dimension Ordinal
     ]
   , prod = \tokens -> case tokens of
@@ -49,7 +49,7 @@
 ruleThOrdinal3 = Rule
   { name = "10th ordinal"
   , pattern =
-    [ regex "dziesi(a|\x0105)t(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "dziesi(a|ą)t(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 10
   }
@@ -69,7 +69,7 @@
 ruleThOrdinal8 = Rule
   { name = "15th ordinal"
   , pattern =
-    [ regex "pi(e|\x0119)tnast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "pi(e|ę)tnast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 15
   }
@@ -78,7 +78,7 @@
 ruleThOrdinal13 = Rule
   { name = "20th ordinal"
   , pattern =
-    [ regex "dwudziest(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "dwudziest(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 20
   }
@@ -87,7 +87,7 @@
 ruleThOrdinal4 = Rule
   { name = "11th ordinal"
   , pattern =
-    [ regex "jedenast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "jedenast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 11
   }
@@ -96,7 +96,7 @@
 ruleFifthOrdinal = Rule
   { name = "fifth ordinal"
   , pattern =
-    [ regex "pi(a|\x0105)t(y|ego|emu|m|(a|\x0105)|ej)"
+    [ regex "pi(a|ą)t(y|ego|emu|m|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 5
   }
@@ -105,7 +105,7 @@
 ruleThOrdinal11 = Rule
   { name = "18th ordinal"
   , pattern =
-    [ regex "osiemnast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "osiemnast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 18
   }
@@ -114,7 +114,7 @@
 ruleSecondOrdinal = Rule
   { name = "second ordinal"
   , pattern =
-    [ regex "drugi?(ego|emu|m|(a|\x0105)|ej)?"
+    [ regex "drugi?(ego|emu|m|(a|ą)|ej)?"
     ]
   , prod = \_ -> Just $ ordinal 2
   }
@@ -123,7 +123,7 @@
 ruleNdOrdinalNoSpace = Rule
   { name = "22nd ordinal no space"
   , pattern =
-    [ regex "dwudziest(ym|y|ego|emu|(a|\x0105)|ej)drugi?(ego|emu|m|(a|\x0105)|ej)?"
+    [ regex "dwudziest(ym|y|ego|emu|(a|ą)|ej)drugi?(ego|emu|m|(a|ą)|ej)?"
     ]
   , prod = \_ -> Just $ ordinal 22
   }
@@ -132,7 +132,7 @@
 ruleSeventhOrdinal = Rule
   { name = "seventh ordinal"
   , pattern =
-    [ regex "si(o|\x00f3)dm(y|ego|emu|m|(a|\x0105)|ej)"
+    [ regex "si(o|ó)dm(y|ego|emu|m|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 7
   }
@@ -141,7 +141,7 @@
 ruleStOrdinalNoSpace = Rule
   { name = "21st ordinal no space"
   , pattern =
-    [ regex "dwudziest(ym|y|ego|emu|(a|\x0105)|ej)pierw?sz(y|ego|emu|m|(a|\x0105)|ej)"
+    [ regex "dwudziest(ym|y|ego|emu|(a|ą)|ej)pierw?sz(y|ego|emu|m|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 21
   }
@@ -150,7 +150,7 @@
 ruleThOrdinal7 = Rule
   { name = "14th ordinal"
   , pattern =
-    [ regex "czternast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "czternast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 14
   }
@@ -159,7 +159,7 @@
 ruleThOrdinal2 = Rule
   { name = "9th ordinal"
   , pattern =
-    [ regex "dziewi(a|\x0105)t(ym|y|ego|em|emu|(a|\x0105)|ej)"
+    [ regex "dziewi(a|ą)t(ym|y|ego|em|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 9
   }
@@ -168,7 +168,7 @@
 ruleThOrdinal9 = Rule
   { name = "16th ordinal"
   , pattern =
-    [ regex "szesnast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "szesnast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 16
   }
@@ -177,7 +177,7 @@
 ruleThOrdinal = Rule
   { name = "8th ordinal"
   , pattern =
-    [ regex "(o|\x00f3|\x00d3)sm(y|ego|emu|m|(a|\x0105)|ej)"
+    [ regex "(o|ó|Ó)sm(y|ego|emu|m|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 8
   }
@@ -186,7 +186,7 @@
 ruleThOrdinal14 = Rule
   { name = "21-29th ordinal"
   , pattern =
-    [ regex "dwudziest(ym|y|ego|emu|(a|\x0105)|ej)( |-)?"
+    [ regex "dwudziest(ym|y|ego|emu|(a|ą)|ej)( |-)?"
     , dimension Ordinal
     ]
   , prod = \tokens -> case tokens of
@@ -199,7 +199,7 @@
 ruleThOrdinal10 = Rule
   { name = "17th ordinal"
   , pattern =
-    [ regex "siedemnast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "siedemnast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 17
   }
@@ -208,7 +208,7 @@
 ruleRdOrdinalNoSpace = Rule
   { name = "23rd ordinal no space"
   , pattern =
-    [ regex "dwudziest(ym|y|ego|emu|(a|\x0105)|ej)trzeci(ego|ch|emu|m|mi|ej|(a|\x0105))?"
+    [ regex "dwudziest(ym|y|ego|emu|(a|ą)|ej)trzeci(ego|ch|emu|m|mi|ej|(a|ą))?"
     ]
   , prod = \_ -> Just $ ordinal 23
   }
@@ -217,7 +217,7 @@
 ruleThOrdinal5 = Rule
   { name = "12th ordinal"
   , pattern =
-    [ regex "dwunast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "dwunast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 12
   }
@@ -226,7 +226,7 @@
 ruleThOrdinal6 = Rule
   { name = "13th ordinal"
   , pattern =
-    [ regex "trzynast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "trzynast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 13
   }
@@ -235,7 +235,7 @@
 ruleFirstOrdinal = Rule
   { name = "first ordinal"
   , pattern =
-    [ regex "pierw?sz(y|ego|emu|m|(a|\x0105)|ej)"
+    [ regex "pierw?sz(y|ego|emu|m|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 1
   }
@@ -244,7 +244,7 @@
 ruleSixthOrdinal = Rule
   { name = "sixth ordinal"
   , pattern =
-    [ regex "sz(o|\x00f3)st(y|ego|emu|m|(a|\x0105)|ej)"
+    [ regex "sz(o|ó)st(y|ego|emu|m|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 6
   }
@@ -253,7 +253,7 @@
 ruleFourthOrdinal = Rule
   { name = "fourth ordinal"
   , pattern =
-    [ regex "czwart(y|ego|emu|ym|(a|\x0105)|ej)"
+    [ regex "czwart(y|ego|emu|ym|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 4
   }
@@ -262,7 +262,7 @@
 ruleThOrdinal15 = Rule
   { name = "30th ordinal"
   , pattern =
-    [ regex "trzydziest(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "trzydziest(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 30
   }
@@ -271,7 +271,7 @@
 ruleThOrdinal12 = Rule
   { name = "19th ordinal"
   , pattern =
-    [ regex "dziewi(\x0119|e)tnast(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "dziewi(ę|e)tnast(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \_ -> Just $ ordinal 19
   }
@@ -280,7 +280,7 @@
 ruleThirdOrdinal = Rule
   { name = "third ordinal"
   , pattern =
-    [ regex "trzeci(ego|ch|emu|m|mi|ej|(a|\x0105))?"
+    [ regex "trzeci(ego|ch|emu|m|mi|ej|(a|ą))?"
     ]
   , prod = \_ -> Just $ ordinal 3
   }
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
@@ -15,13 +15,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/PT/Rules.hs b/Duckling/Ordinal/PT/Rules.hs
--- a/Duckling/Ordinal/PT/Rules.hs
+++ b/Duckling/Ordinal/PT/Rules.hs
@@ -25,7 +25,7 @@
 ruleOrdinalsPrimeiro = Rule
   { name = "ordinals (primeiro..10)"
   , pattern =
-    [ regex "((primeir|segund|quart|quint|sext|s(e|\x00e9)tim|oitav|non|d(e|\x00e9)cim)(os?|as?))"
+    [ regex "((primeir|segund|quart|quint|sext|s(e|é)tim|oitav|non|d(e|é)cim)(os?|as?))"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
@@ -54,13 +54,13 @@
         "sexta" -> Just $ ordinal 6
         "sextas" -> Just $ ordinal 6
         "setimas" -> Just $ ordinal 7
-        "s\x00e9tima" -> Just $ ordinal 7
+        "sétima" -> Just $ ordinal 7
         "setimo" -> Just $ ordinal 7
         "setimos" -> Just $ ordinal 7
         "setima" -> Just $ ordinal 7
-        "s\x00e9timos" -> Just $ ordinal 7
-        "s\x00e9timo" -> Just $ ordinal 7
-        "s\x00e9timas" -> Just $ ordinal 7
+        "sétimos" -> Just $ ordinal 7
+        "sétimo" -> Just $ ordinal 7
+        "sétimas" -> Just $ ordinal 7
         "oitavas" -> Just $ ordinal 8
         "oitava" -> Just $ ordinal 8
         "oitavo" -> Just $ ordinal 8
@@ -69,14 +69,14 @@
         "nona" -> Just $ ordinal 9
         "nono" -> Just $ ordinal 9
         "nonas" -> Just $ ordinal 9
-        "d\x00e9cimos" -> Just $ ordinal 10
+        "décimos" -> Just $ ordinal 10
         "decimo" -> Just $ ordinal 10
         "decimos" -> Just $ ordinal 10
-        "d\x00e9cimo" -> Just $ ordinal 10
+        "décimo" -> Just $ ordinal 10
         "decimas" -> Just $ ordinal 10
-        "d\x00e9cima" -> Just $ ordinal 10
+        "décima" -> Just $ ordinal 10
         "decima" -> Just $ ordinal 10
-        "d\x00e9cimas" -> Just $ ordinal 10
+        "décimas" -> Just $ ordinal 10
         _ -> Nothing
       _ -> Nothing
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/RO/Rules.hs b/Duckling/Ordinal/RO/Rules.hs
--- a/Duckling/Ordinal/RO/Rules.hs
+++ b/Duckling/Ordinal/RO/Rules.hs
@@ -70,14 +70,14 @@
   , ("\537apte", 7)
   , ("opt", 8)
   , ("noua", 9)
-  , ("nou\x0103", 9)
+  , ("nouă", 9)
   ]
 
 ruleSpelledOutOrdinals :: Rule
 ruleSpelledOutOrdinals = Rule
   { name = "spelled out ordinals"
   , pattern =
-    [ regex "al?\\s(doi|trei|patru|cinci|(s|\x0219)a(s|pt)e|opt|nou(a|\x0103))[ -]?(le)?a"
+    [ regex "al?\\s(doi|trei|patru|cinci|(s|ș)a(s|pt)e|opt|nou(a|ă))[ -]?(le)?a"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RU}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, 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
@@ -27,30 +27,30 @@
 ruleOrdinalsFirstth = Rule
   { name = "ordinals (first..19th)"
   , pattern =
-    [ regex "(\x043f\x0435\x0440\x0432|\x0432\x0442\x043e\x0440|\x0442\x0440\x0435\x0442|\x0447\x0435\x0442\x0432\x0435\x0440\x0442|\x043f\x044f\x0442|\x0448\x0435\x0441\x0442|\x0441\x0435\x0434\x044c\x043c|\x0432\x043e\x0441\x044c\x043c|\x0434\x0435\x0432\x044f\x0442|\x0434\x0435\x0441\x044f\x0442|\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x0430\x0442|\x0434\x0432\x0435\x043d\x0430\x0434\x0446\x0430\x0442|\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x0430\x0442|\x0447\x0435\x0442\x044b\x0440\x043d\x0430\x0434\x0446\x0430\x0442|\x043f\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442|\x0448\x0435\x0441\x0442\x043d\x0430\x0434\x0446\x0430\x0442|\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442|\x0432\x043e\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442|\x0434\x0435\x0432\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442|\x0434\x0432\x0430\x0434\x0446\x0430\x0442)(\x044b\x0439|\x043e\x0439|\x0438\x0439|\x0430\x044f|\x043e\x0435)"
+    [ regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят|десят|одинадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат)(ый|ой|ий|ая|ое)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\x043f\x0435\x0440\x0432" -> Just $ ordinal 1
-        "\x0432\x0442\x043e\x0440" -> Just $ ordinal 2
-        "\x0442\x0440\x0435\x0442" -> Just $ ordinal 3
-        "\x0447\x0435\x0442\x0432\x0435\x0440\x0442" -> Just $ ordinal 4
-        "\x043f\x044f\x0442" -> Just $ ordinal 5
-        "\x0448\x0435\x0441\x0442" -> Just $ ordinal 6
-        "\x0441\x0435\x0434\x044c\x043c" -> Just $ ordinal 7
-        "\x0432\x043e\x0441\x044c\x043c" -> Just $ ordinal 8
-        "\x0434\x0435\x0432\x044f\x0442" -> Just $ ordinal 9
-        "\x0434\x0435\x0441\x044f\x0442" -> Just $ ordinal 10
-        "\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 11
-        "\x0434\x0432\x0435\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 12
-        "\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 13
-        "\x0447\x0435\x0442\x044b\x0440\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 14
-        "\x043f\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 15
-        "\x0448\x0435\x0441\x0442\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 16
-        "\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 17
-        "\x0432\x043e\x0441\x0435\x043c\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 18
-        "\x0434\x0435\x0432\x044f\x0442\x043d\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 19
-        "\x0434\x0432\x0430\x0434\x0446\x0430\x0442" -> Just $ ordinal 20
+        "перв" -> 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
       _ -> Nothing
   }
@@ -59,33 +59,33 @@
 ruleOrdinal = Rule
   { name = "ordinal 21..99"
   , pattern =
-    [ regex "(\x0434\x0432\x0430\x0434\x0446\x0430\x0442\x044c|\x0442\x0440\x0438\x0434\x0446\x0430\x0442\x044c|\x0441\x043e\x0440\x043e\x043a|\x043f\x044f\x0442\x044c\x0434\x0435\x0441\x044f\x0442|\x0448\x0435\x0441\x0442\x044c\x0434\x0435\x0441\x044f\x0442|\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442|\x0432\x043e\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442|\x0434\x0435\x0432\x044f\x043d\x043e\x0441\x0442\x043e)"
-    , regex "(\x043f\x0435\x0440\x0432|\x0432\x0442\x043e\x0440|\x0442\x0440\x0435\x0442|\x0447\x0435\x0442\x0432\x0435\x0440\x0442|\x043f\x044f\x0442|\x0448\x0435\x0441\x0442|\x0441\x0435\x0434\x044c\x043c|\x0432\x043e\x0441\x044c\x043c|\x0434\x0435\x0432\x044f\x0442)(\x044b\x0439|\x043e\x0439|\x0438\x0439|\x0430\x044f|\x043e\x0435)"
+    [ regex "(двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)"
+    , regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят)(ый|ой|ий|ая|ое)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (m1:_)):
        Token RegexMatch (GroupMatch (m2:_)):
        _) -> do
          dozen <- case Text.toLower m1 of
-           "\x0434\x0432\x0430\x0434\x0446\x0430\x0442\x044c" -> Just 20
-           "\x0442\x0440\x0438\x0434\x0446\x0430\x0442\x044c" -> Just 30
-           "\x0441\x043e\x0440\x043e\x043a" -> Just 40
-           "\x043f\x044f\x0442\x044c\x0434\x0435\x0441\x044f\x0442" -> Just 50
-           "\x0448\x0435\x0441\x0442\x044c\x0434\x0435\x0441\x044f\x0442" -> Just 60
-           "\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442" -> Just 70
-           "\x0432\x043e\x0441\x0435\x043c\x044c\x0434\x0435\x0441\x044f\x0442" -> Just 80
-           "\x0434\x0435\x0432\x044f\x043d\x043e\x0441\x0442\x043e" -> Just 90
+           "двадцать" -> Just 20
+           "тридцать" -> Just 30
+           "сорок" -> Just 40
+           "пятьдесят" -> Just 50
+           "шестьдесят" -> Just 60
+           "семьдесят" -> Just 70
+           "восемьдесят" -> Just 80
+           "девяносто" -> Just 90
            _ -> Nothing
          unit <- case Text.toLower m2 of
-           "\x043f\x0435\x0440\x0432" -> Just 1
-           "\x0432\x0442\x043e\x0440" -> Just 2
-           "\x0442\x0440\x0435\x0442" -> Just 3
-           "\x0447\x0435\x0442\x0432\x0435\x0440\x0442" -> Just 4
-           "\x043f\x044f\x0442" -> Just 5
-           "\x0448\x0435\x0441\x0442" -> Just 6
-           "\x0441\x0435\x0434\x044c\x043c" -> Just 7
-           "\x0432\x043e\x0441\x044c\x043c" -> Just 8
-           "\x0434\x0435\x0432\x044f\x0442" -> Just 9
+           "перв" -> Just 1
+           "втор" -> Just 2
+           "трет" -> Just 3
+           "четверт" -> Just 4
+           "пят" -> Just 5
+           "шест" -> Just 6
+           "седьм" -> Just 7
+           "восьм" -> Just 8
+           "девят" -> Just 9
            _ -> Nothing
          Just . ordinal $ dozen + unit
       _ -> Nothing
@@ -95,7 +95,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "0*(\\d+)-?((\x044b|\x043e|\x0438)?\x0439|\x0430\x044f|\x043e\x0435)"
+    [ regex "0*(\\d+)-?((ы|о|и)?й|ая|ое)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
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
@@ -14,30 +14,68 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = SV}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
   [ examples (OrdinalData 1)
-             [ "förste"
-             , "första"
+             [ "första"
+             , "förste"
+             , "1a"
              , "1:a"
-             , "1:e"
              ]
-  , examples (OrdinalData 10)
-             [ "tionde"
-             , "10."
-             , "10"
+  , examples (OrdinalData 2)
+             [ "andra"
+             , "andre"
+             , "2a"
+             , "2:a"
              ]
-  , examples (OrdinalData 26)
-             [ "seksogtjuende"
-             , "Seksogtyvende"
-             , "26e"
+  , examples (OrdinalData 3)
+             [ "tredje"
+             , "3e"
+             , "3:e"
              ]
+  , examples (OrdinalData 4)
+             [ "fjärde"
+             , "4e"
+             , "4:e"
+             ]
+  , examples (OrdinalData 8)
+             [ "åttonde"
+             , "8e"
+             , "8:e"
+             ]
+  , examples (OrdinalData 25)
+             [ "tjugofemte"
+             , "25e"
+             , "25:e"
+             ]
+  , examples (OrdinalData 31)
+             [ "trettioförsta"
+             , "trettioförste"
+             , "31a"
+             , "31:a"
+             ]
+  , examples (OrdinalData 42)
+             [ "fyrtioandra"
+             , "fyrtioandre"
+             , "42a"
+             , "42:a"
+             ]
+  , examples (OrdinalData 77)
+            [ "sjuttiosjunde"
+            , "77e"
+            , "77:e"
+            ]
+  , examples (OrdinalData 90)
+            [ "nittionde"
+            , "90e"
+            , "90:e"
+            ]
   ]
diff --git a/Duckling/Ordinal/SV/Rules.hs b/Duckling/Ordinal/SV/Rules.hs
--- a/Duckling/Ordinal/SV/Rules.hs
+++ b/Duckling/Ordinal/SV/Rules.hs
@@ -12,9 +12,13 @@
 module Duckling.Ordinal.SV.Rules
   ( rules ) where
 
-import qualified Data.Text as Text
-import Prelude
+import Control.Monad (join)
+import Data.HashMap.Strict ( HashMap)
 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 (parseInt)
@@ -22,65 +26,82 @@
 import Duckling.Regex.Types
 import Duckling.Types
 
-ruleOrdinalsFirstst :: Rule
-ruleOrdinalsFirstst = Rule
-  { name = "ordinals (first..31st)"
+ordinalsMap :: HashMap Text Int
+ordinalsMap = HashMap.fromList
+  [ ( "första", 1 )
+  , ( "förste", 1 )
+  , ( "andra", 2 )
+  , ( "andre", 2)
+  , ( "tredje", 3 )
+  , ( "fjärde", 4 )
+  , ( "femte", 5 )
+  , ( "sjätte", 6 )
+  , ( "sjunde", 7 )
+  , ( "åttonde", 8 )
+  , ( "nionde", 9 )
+  , ( "tionde", 10 )
+  , ( "elfte", 11 )
+  , ( "tolfte", 12 )
+  , ( "trettonde", 13 )
+  , ( "fjortonde", 14 )
+  , ( "femtonde", 15 )
+  , ( "sextonde", 16 )
+  , ( "sjuttonde", 17 )
+  , ( "artonde", 18 )
+  , ( "nittonde", 19 )
+  , ( "tjugonde", 20 )
+  , ( "trettionde", 30 )
+  , ( "fyrtionde", 40 )
+  , ( "femtionde", 50 )
+  , ( "sextionde", 60 )
+  , ( "sjuttionde", 70 )
+  , ( "åttionde", 80 )
+  , ( "nittionde", 90 )
+  ]
+
+cardinalsMap :: HashMap Text Int
+cardinalsMap = HashMap.fromList
+  [ ( "tjugo", 20 )
+  , ( "trettio", 30 )
+  , ( "fyrtio", 40 )
+  , ( "femtio", 50 )
+  , ( "sextio", 60 )
+  , ( "sjuttio", 70 )
+  , ( "åttio", 80 )
+  , ( "nittio", 90 )
+  ]
+
+ruleOrdinals :: Rule
+ruleOrdinals = Rule
+  { name = "ordinals (first..twentieth,thirtieth,...)"
   , pattern =
-    [ regex "(f\x00f6rste|f\x00f6rsta|andra|tredje|fj\x00e4rde|femte|sj\x00e4tte|sjunde|\x00e5ttonde|nionde|tionde|ellevte|tolfte|trettonde|fjortonde|femtonde|sekstende|syttende|attende|nittende|tyvende|tjuende|enogtyvende|toogtyvende|treogtyvende|fireogtyvende|femogtyvende|seksogtyvende|syvogtyvende|\x00e5tteogtyvende|niogtyvende|enogtjuende|toogtjuende|treogtjuende|fireogtjuende|femogtjuende|seksogtjuende|syvogtjuende|\x00e5tteogtyvend|niogtjuende|tredefte|enogtredefte)"
+    [ regex "(första|förste|andra|andre|tredje|fjärde|femte|sjätte|sjunde|åttonde|nionde|tionde|elfte|tolfte|trettionde|fjortonde|femtonde|sextonde|sjuttonde|artonde|nittonde|tjugonde|trettionde|fyrtionde|femtonde|sextionde|sjuttionde|åttionde|nittionde)"
     ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "f\x00f6rsta" -> Just $ ordinal 1
-        "f\x00f6rste" -> Just $ ordinal 1
-        "andra" -> Just $ ordinal 2
-        "tredje" -> Just $ ordinal 3
-        "fj\x00e4rde" -> Just $ ordinal 4
-        "femte" -> Just $ ordinal 5
-        "sj\x00e4tte" -> Just $ ordinal 6
-        "sjunde" -> Just $ ordinal 7
-        "\x00e5ttonde" -> Just $ ordinal 8
-        "nionde" -> Just $ ordinal 9
-        "tionde" -> Just $ ordinal 10
-        "ellevte" -> Just $ ordinal 11
-        "tolfte" -> Just $ ordinal 12
-        "trettonde" -> Just $ ordinal 13
-        "fjortonde" -> Just $ ordinal 14
-        "femtonde" -> Just $ ordinal 15
-        "sekstende" -> Just $ ordinal 16
-        "syttende" -> Just $ ordinal 17
-        "attende" -> Just $ ordinal 18
-        "nittende" -> Just $ ordinal 19
-        "tyvende" -> Just $ ordinal 20
-        "tjuende" -> Just $ ordinal 20
-        "enogtjuende" -> Just $ ordinal 21
-        "enogtyvende" -> Just $ ordinal 21
-        "toogtyvende" -> Just $ ordinal 22
-        "toogtjuende" -> Just $ ordinal 22
-        "treogtyvende" -> Just $ ordinal 23
-        "treogtjuende" -> Just $ ordinal 23
-        "fireogtjuende" -> Just $ ordinal 24
-        "fireogtyvende" -> Just $ ordinal 24
-        "femogtyvende" -> Just $ ordinal 25
-        "femogtjuende" -> Just $ ordinal 25
-        "seksogtjuende" -> Just $ ordinal 26
-        "seksogtyvende" -> Just $ ordinal 26
-        "syvogtyvende" -> Just $ ordinal 27
-        "syvogtjuende" -> Just $ ordinal 27
-        "\x00e5tteogtyvende" -> Just $ ordinal 28
-        "\x00e5tteogtjuende" -> Just $ ordinal 28
-        "niogtyvende" -> Just $ ordinal 29
-        "niogtjuende" -> Just $ ordinal 29
-        "tredefte" -> Just $ ordinal 30
-        "enogtredefte" -> Just $ ordinal 31
-        _ -> Nothing
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
       _ -> Nothing
+    }
+
+ruleCompositeOrdinals :: Rule
+ruleCompositeOrdinals = Rule
+  { name = "ordinals (composite, e.g., eighty-seven)"
+  , pattern =
+    [ regex "(tjugo|trettio|fyrtio|femtio|sextio|sjuttio|åttio|nittio)(första|förste|andra|andre|tredje|fjärde|femte|sjätte|sjunde|åttonde|nionde)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (tens:units:_)):_) -> do
+        tt <- HashMap.lookup (Text.toLower tens) cardinalsMap
+        uu <- HashMap.lookup (Text.toLower units) ordinalsMap
+        Just . ordinal $ tt + uu
+      _ -> Nothing
   }
 
 ruleOrdinalDigits :: Rule
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "0*(\\d+)(\\.|e|\\:[ae])?"
+    [ regex "0*(\\d+):?(a|e)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
@@ -89,6 +110,7 @@
 
 rules :: [Rule]
 rules =
-  [ ruleOrdinalDigits
-  , ruleOrdinalsFirstst
+  [ ruleOrdinals
+  , ruleCompositeOrdinals
+  , ruleOrdinalDigits
   ]
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = TR}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/TR/Rules.hs b/Duckling/Ordinal/TR/Rules.hs
--- a/Duckling/Ordinal/TR/Rules.hs
+++ b/Duckling/Ordinal/TR/Rules.hs
@@ -29,30 +29,30 @@
 ordinals =
   [ "birinci"
   , "ikinci"
-  , "\x00fc\x00e7\x00fcnc\x00fc"
-  , "d\x00f6rd\x00fcnc\x00fc"
-  , "be\x015finci"
-  , "alt\x0131nc\x0131"
+  , "üçüncü"
+  , "dördüncü"
+  , "beşinci"
+  , "altıncı"
   , "yedinci"
   , "sekizinci"
   , "dokuzuncu"
   , "onuncu"
   , "on birinci"
   , "on ikinci"
-  , "on \x00fc\x00e7\x00fcnc\x00fc"
-  , "on d\x00f6rd\x00fcnc\x00fc"
-  , "on be\x015finci"
-  , "on alt\x0131nc\x0131"
+  , "on üçüncü"
+  , "on dördüncü"
+  , "on beşinci"
+  , "on altıncı"
   , "on yedinci"
   , "on sekizinci"
   , "on dokuzuncu"
   , "yirminci"
   , "yirmi birinci"
   , "yirmi ikinci"
-  , "yirmi \x00fc\x00e7\x00fcnc\x00fc"
-  , "yirmi d\x00f6rd\x00fcnc\x00fc"
-  , "yirmi be\x015finci"
-  , "yirmi alt\x0131nc\x0131"
+  , "yirmi üçüncü"
+  , "yirmi dördüncü"
+  , "yirmi beşinci"
+  , "yirmi altıncı"
   , "yirmi yedinci"
   , "yirmi sekizinci"
   , "yirmi dokuzuncu"
@@ -80,7 +80,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "0*(\\d+) ?('?)(inci|nci|\x0131nc\x0131|nc\x0131|uncu|ncu|\x00fcnc\x00fc|nc\x00fc|.)"
+    [ regex "0*(\\d+) ?('?)(inci|nci|ıncı|ncı|uncu|ncu|üncü|ncü|.)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = UK}, allExamples)
+corpus = (testContext {locale = makeLocale UK Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/UK/Rules.hs b/Duckling/Ordinal/UK/Rules.hs
--- a/Duckling/Ordinal/UK/Rules.hs
+++ b/Duckling/Ordinal/UK/Rules.hs
@@ -28,33 +28,33 @@
 
 ordinalsFirstThMap :: HashMap Text Int
 ordinalsFirstThMap = HashMap.fromList
-  [ ( "\x043f\x0435\x0440\x0448"                   , 1 )
-  , ( "\x0434\x0440\x0443\x0433"                   , 2 )
-  , ( "\x0442\x0440\x0435\x0442"                   , 3 )
-  , ( "\x0447\x0435\x0442\x0432\x0435\x0440\x0442" , 4 )
-  , ( "\x043f\x2018\x044f\x0442"                   , 5 )
-  , ( "\x0448\x043e\x0441\x0442"                   , 6 )
-  , ( "\x0441\x044c\x043e\x043c"                   , 7 )
-  , ( "\x0432\x043e\x0441\x044c\x043c"             , 8 )
-  , ( "\x0434\x0435\x0432\x2018\x044f\x0442"       , 9 )
-  , ( "\x0434\x0435\x0441\x044f\x0442"             , 10 )
-  , ( "\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x044f\x0442"             , 11 )
-  , ( "\x0434\x0432\x0430\x043d\x0430\x0434\x0446\x044f\x0442"             , 12 )
-  , ( "\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x044f\x0442"             , 13 )
-  , ( "\x0447\x043e\x0442\x0438\x0440\x043d\x0430\x0434\x0446\x044f\x0442" , 14 )
-  , ( "\x043f\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442"       , 15 )
-  , ( "\x0448\x0456\x0441\x0442\x043d\x0430\x0434\x0446\x044f\x0442"       , 16 )
-  , ( "\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442"             , 17 )
-  , ( "\x0432\x0456\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442" , 18 )
-  , ( "\x0434\x0435\x0432\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442" , 19 )
-  , ( "\x0434\x0432\x0430\x0434\x0446\x044f\x0442"                               , 20 )
+  [ ( "перш"                   , 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 "(\x043f\x0435\x0440\x0448|\x0434\x0440\x0443\x0433|\x0442\x0440\x0435\x0442|\x0447\x0435\x0442\x0432\x0435\x0440\x0442|\x043f\x2018\x044f\x0442|\x0448\x043e\x0441\x0442|\x0441\x044c\x043e\x043c|\x0432\x043e\x0441\x044c\x043c|\x0434\x0435\x0432\x2018\x044f\x0442|\x0434\x0435\x0441\x044f\x0442|\x043e\x0434\x0438\x043d\x0430\x0434\x0446\x044f\x0442|\x0434\x0432\x0430\x043d\x0430\x0434\x0446\x044f\x0442|\x0442\x0440\x0438\x043d\x0430\x0434\x0446\x044f\x0442|\x0447\x043e\x0442\x0438\x0440\x043d\x0430\x0434\x0446\x044f\x0442|\x043f\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442|\x0448\x0456\x0441\x0442\x043d\x0430\x0434\x0446\x044f\x0442|\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442|\x0432\x0456\x0441\x0456\x043c\x043d\x0430\x0434\x0446\x044f\x0442|\x0434\x0435\x0432\x2018\x044f\x0442\x043d\x0430\x0434\x0446\x044f\x0442|\x0434\x0432\x0430\x0434\x0446\x044f\x0442)(\x0438\x0439|\x0456\x0439|\x0430|\x044f|\x0435|\x0454)"
+    [ regex "(перш|друг|трет|четверт|п‘ят|шост|сьом|восьм|дев‘ят|десят|одинадцят|дванадцят|тринадцят|чотирнадцят|п‘ятнадцят|шістнадцят|сімнадцят|вісімнадцят|дев‘ятнадцят|двадцят)(ий|ій|а|я|е|є)"
     ]
   , prod = \tokens -> case tokens of
     (Token RegexMatch (GroupMatch (match:_)):_) ->
@@ -64,22 +64,22 @@
 
 ordinalTensMap :: HashMap Text Int
 ordinalTensMap = HashMap.fromList
-  [ ( "\x0434\x0432\x0430\x0434\x0446\x044f\x0442\x044c"             , 20 )
-  , ( "\x0442\x0440\x0438\x0434\x0446\x044f\x0442\x044c"             , 30 )
-  , ( "\x0441\x043e\x0440\x043e\x043a"                               , 40 )
-  , ( "\x043f\x2018\x044f\x0442\x0434\x0435\x0441\x044f\x0442"       , 50 )
-  , ( "\x0448\x0456\x0441\x0442\x0434\x0435\x0441\x044f\x0442"       , 60 )
-  , ( "\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442"             , 70 )
-  , ( "\x0432\x0456\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442" , 80 )
-  , ( "\x0434\x0435\x0432\x2018\x044f\x043d\x043e\x0441\x0442\x043e" , 90 )
+  [ ( "двадцять"             , 20 )
+  , ( "тридцять"             , 30 )
+  , ( "сорок"                               , 40 )
+  , ( "п‘ятдесят"       , 50 )
+  , ( "шістдесят"       , 60 )
+  , ( "сімдесят"             , 70 )
+  , ( "вісімдесят" , 80 )
+  , ( "дев‘яносто" , 90 )
   ]
 
 ruleOrdinal :: Rule
 ruleOrdinal = Rule
   { name = "ordinal 21..99"
   , pattern =
-    [ regex "(\x0434\x0432\x0430\x0434\x0446\x044f\x0442\x044c|\x0442\x0440\x0438\x0434\x0446\x044f\x0442\x044c|\x0441\x043e\x0440\x043e\x043a|\x043f\x2018\x044f\x0442\x0434\x0435\x0441\x044f\x0442|\x0448\x0456\x0441\x0442\x044c\x0434\x0435\x0441\x044f\x0442|\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442|\x0432\x0456\x0441\x0456\x043c\x0434\x0435\x0441\x044f\x0442|\x0434\x0435\x0432\x2018\x044f\x043d\x043e\x0441\x0442\x043e)"
-    , regex "(\x043f\x0435\x0440\x0448|\x0434\x0440\x0443\x0433|\x0442\x0440\x0435\x0442|\x0447\x0435\x0442\x0432\x0435\x0440\x0442|\x043f\x2018\x044f\x0442|\x0448\x043e\x0441\x0442|\x0441\x044c\x043e\x043c|\x0432\x043e\x0441\x044c\x043c|\x0434\x0435\x0432\x2018\x044f\x0442)(\x0438\x0439|\x0456\x0439|\x0430|\x044f|\x0435|\x0454)"
+    [ regex "(двадцять|тридцять|сорок|п‘ятдесят|шістьдесят|сімдесят|вісімдесят|дев‘яносто)"
+    , regex "(перш|друг|трет|четверт|п‘ят|шост|сьом|восьм|дев‘ят)(ий|ій|а|я|е|є)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (m1:_)):
@@ -95,7 +95,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "0*(\\d+)-?((\x0438|\x0456)?\x0439|\x0430|\x044f|\x0435|\x0454)"
+    [ regex "0*(\\d+)-?((и|і)?й|а|я|е|є)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = VI}, allExamples)
+corpus = (testContext {locale = makeLocale VI Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/VI/Rules.hs b/Duckling/Ordinal/VI/Rules.hs
--- a/Duckling/Ordinal/VI/Rules.hs
+++ b/Duckling/Ordinal/VI/Rules.hs
@@ -22,7 +22,7 @@
 ruleOrdinals = Rule
   { name = "ordinals"
   , pattern =
-    [ regex "(\x0111\x1ea7u ti\x00ean|th\x1ee9 nh\x1ea5t|th\x1ee9 1)"
+    [ regex "(đầu tiên|thứ nhất|thứ 1)"
     ]
   , prod = \_ -> Just $ ordinal 1
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ordinal.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ZH}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/ZH/Rules.hs b/Duckling/Ordinal/ZH/Rules.hs
--- a/Duckling/Ordinal/ZH/Rules.hs
+++ b/Duckling/Ordinal/ZH/Rules.hs
@@ -25,7 +25,7 @@
 ruleOrdinalDigits = Rule
   { name = "ordinal (digits)"
   , pattern =
-    [ regex "\x7b2c"
+    [ regex "第"
     , dimension Numeral
     ]
   , prod = \tokens -> case tokens of
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
@@ -15,13 +15,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.PhoneNumber.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, 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
@@ -25,9 +25,25 @@
   [ examples (QuantityData Pound 2 (Just "meat"))
              [ "two pounds of meat"
              ]
+  , examples (QuantityData Gram 2 Nothing)
+             [ "2 grams"
+             , "0.002 kg"
+             , "2/1000 kilograms"
+             , "2000 milligrams"
+             ]
+  , examples (QuantityData Gram 1000 Nothing)
+             [ "a kilogram"
+             , "a kg"
+             ]
   , examples (QuantityData Pound 1 Nothing)
              [ "a Pound"
+             , "1 lb"
+             , "a lb"
              ]
+  , examples (QuantityData Ounce 2 Nothing)
+             [ "2 ounces"
+             , "2oz"
+             ]
   , examples (QuantityData Cup 3 (Just "sugar"))
              [ "3 Cups of sugar"
              ]
@@ -39,5 +55,8 @@
   , examples (QuantityData Gram 500 (Just "strawberries"))
              [ "500 grams of strawberries"
              , "500g of strawberries"
+             , "0.5 kilograms of strawberries"
+             , "0.5 kg of strawberries"
+             , "500000mg of strawberries"
              ]
   ]
diff --git a/Duckling/Quantity/EN/Rules.hs b/Duckling/Quantity/EN/Rules.hs
--- a/Duckling/Quantity/EN/Rules.hs
+++ b/Duckling/Quantity/EN/Rules.hs
@@ -13,60 +13,66 @@
   ( rules ) where
 
 import Data.String
+import Data.Text (Text)
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers
 import Duckling.Quantity.Helpers
 import Duckling.Regex.Types
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.Quantity.Types as TQuantity
 
-ruleNumeralQuantity :: Rule
-ruleNumeralQuantity = Rule
-  { name = "<number> <quantity>"
-  , pattern =
-    [ dimension Numeral
-    , regex "((pound|cup|gram)s?|g)"
-    ]
-  , prod = \tokens -> case tokens of
-    (Token Numeral nd:
-     Token RegexMatch (GroupMatch (match:_)):
-     _) -> case Text.toLower match of
-      "cup"    ->
-        Just . Token Quantity . quantity TQuantity.Cup $ TNumeral.value nd
-      "cups"   ->
-        Just . Token Quantity . quantity TQuantity.Cup $ TNumeral.value nd
-      "g"      ->
-        Just . Token Quantity . quantity TQuantity.Gram $ TNumeral.value nd
-      "gram"   ->
-        Just . Token Quantity . quantity TQuantity.Gram $ TNumeral.value nd
-      "grams"  ->
-        Just . Token Quantity . quantity TQuantity.Gram $ TNumeral.value nd
-      "pound"  ->
-        Just . Token Quantity . quantity TQuantity.Pound $ TNumeral.value nd
-      "pounds" ->
-        Just . Token Quantity . quantity TQuantity.Pound $ TNumeral.value nd
-      _        -> Nothing
-    _ -> Nothing
-  }
+quantities :: [(Text, String, TQuantity.Unit)]
+quantities =
+  [ ("<quantity> cups", "(cups?)", TQuantity.Cup)
+  , ("<quantity> grams", "(((m(illi)?)|(k(ilo)?))?g(ram)?s?)", TQuantity.Gram)
+  , ("<quantity> lb", "((lb|pound)s?)", TQuantity.Pound)
+  , ("<quantity> oz", "((ounces?)|oz)", TQuantity.Ounce)
+  ]
 
-ruleAQuantity :: Rule
-ruleAQuantity = Rule
-  { name = "a quantity"
-  , pattern =
-    [ regex "a (pound|cup|gram)s?"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "cup"    -> Just . Token Quantity $ quantity TQuantity.Cup 1
-        "gram"   -> Just . Token Quantity $ quantity TQuantity.Gram 1
-        "pound"  -> Just . Token Quantity $ quantity TQuantity.Pound 1
-        _        -> Nothing
-      _ -> Nothing
-  }
+getValue :: Text -> Double -> Double
+getValue match value = case Text.toLower match of
+  "milligram" -> value / 1000
+  "milligrams" -> value / 1000
+  "mg" -> value / 1000
+  "mgs" -> value / 1000
+  "kilogram" -> value * 1000
+  "kilograms" -> value * 1000
+  "kg" -> value * 1000
+  "kgs" -> value * 1000
+  _ -> value
 
+ruleNumeralQuantities :: [Rule]
+ruleNumeralQuantities = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [ numberWith TNumeral.value (> 0), regex regexPattern ]
+      , prod = \tokens -> case tokens of
+        (Token Numeral nd:
+         Token RegexMatch (GroupMatch (match:_)):
+         _) -> Just . Token Quantity $ quantity u value
+          where value = getValue match $ TNumeral.value nd
+        _ -> Nothing
+      }
+
+ruleAQuantity :: [Rule]
+ruleAQuantity = map go quantities
+  where
+    go :: (Text, String, TQuantity.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [ regex ("an? " ++ regexPattern) ]
+      , prod = \tokens -> case tokens of
+        (Token RegexMatch (GroupMatch (match:_)):
+         _) -> Just . Token Quantity $ quantity u $ getValue match 1
+        _ -> Nothing
+      }
+
 ruleQuantityOfProduct :: Rule
 ruleQuantityOfProduct = Rule
   { name = "<quantity> of product"
@@ -82,7 +88,7 @@
 
 rules :: [Rule]
 rules =
-  [ ruleNumeralQuantity
-  , ruleAQuantity
-  , ruleQuantityOfProduct
+  [ ruleQuantityOfProduct
   ]
+  ++ ruleNumeralQuantities
+  ++ ruleAQuantity
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Quantity.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/FR/Rules.hs b/Duckling/Quantity/FR/Rules.hs
--- a/Duckling/Quantity/FR/Rules.hs
+++ b/Duckling/Quantity/FR/Rules.hs
@@ -29,7 +29,7 @@
   { name = "<number> <units>"
   , pattern =
     [ dimension Numeral
-    , regex "(tasses?|cuill?(e|\x00e8)res? (a|\x00e0) soupe?)"
+    , regex "(tasses?|cuill?(e|è)res? (a|à) soupe?)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData {TNumeral.value = v}:
@@ -46,7 +46,7 @@
   { name = "<quantity> of product"
   , pattern =
     [ dimension Quantity
-    , regex "de (caf(e|\x00e9)|sucre)"
+    , regex "de (caf(e|é)|sucre)"
     ]
   , prod = \tokens -> case tokens of
       (Token Quantity qd:
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Quantity.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, 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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Quantity.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/KO/Rules.hs b/Duckling/Quantity/KO/Rules.hs
--- a/Duckling/Quantity/KO/Rules.hs
+++ b/Duckling/Quantity/KO/Rules.hs
@@ -28,7 +28,7 @@
   { name = "<quantity> of product"
   , pattern =
     [ dimension Quantity
-    , regex "\xc758 (\xc0bc\xacb9\xc0b4|\xcf5c\xb77c)"
+    , regex "의 (삼겹살|콜라)"
     ]
   , prod = \tokens -> case tokens of
       (Token Quantity qd:
@@ -41,7 +41,7 @@
 ruleQuantityOfProduct2 = Rule
   { name = "<quantity> of product"
   , pattern =
-    [ regex "(\xc0bc\xacb9\xc0b4|\xcf5c\xb77c)"
+    [ regex "(삼겹살|콜라)"
     , dimension Quantity
     ]
   , prod = \tokens -> case tokens of
@@ -56,22 +56,22 @@
   { name = "<number> <units>"
   , pattern =
     [ dimension Numeral
-    , regex "(\xac1c|\xd310|\xadf8(\xb7a8|\xb78c)|\xadfc|\xd30c\xc6b4(\xb4dc|\xc988)|\xc8111\xc2dc|\xadf8\xb987|\xcef5)"
+    , regex "(개|판|그(램|람)|근|파운(드|즈)|접1시|그릇|컵)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData {TNumeral.value = v}:
        Token RegexMatch (GroupMatch (match:_)):
        _) -> case match of
-         "\xac1c"             -> Just . Token Quantity $ quantity TQuantity.Unnamed v
-         "\xd310"             -> Just . Token Quantity $ quantity (TQuantity.Custom "판") v
-         "\xadfc"             -> Just . Token Quantity $ quantity (TQuantity.Custom "근") v
-         "\xadf8\xb7a8"       -> Just . Token Quantity $ quantity TQuantity.Gram v
-         "\xadf8\xb78c"       -> Just . Token Quantity $ quantity TQuantity.Gram v
-         "\xd30c\xc6b4\xb4dc" -> Just . Token Quantity $ quantity TQuantity.Pound v
-         "\xd30c\xc6b4\xc988" -> Just . Token Quantity $ quantity TQuantity.Pound v
-         "\xc8111\xc2dc"      -> Just . Token Quantity $ quantity TQuantity.Dish v
-         "\xadf8\xb987"       -> Just . Token Quantity $ quantity TQuantity.Bowl v
-         "\xcef5"             -> Just . Token Quantity $ quantity TQuantity.Cup v
+         "개"             -> Just . Token Quantity $ quantity TQuantity.Unnamed v
+         "판"             -> Just . Token Quantity $ quantity (TQuantity.Custom "판") v
+         "근"             -> Just . Token Quantity $ quantity (TQuantity.Custom "근") v
+         "그램"       -> Just . Token Quantity $ quantity TQuantity.Gram v
+         "그람"       -> Just . Token Quantity $ quantity TQuantity.Gram v
+         "파운드" -> Just . Token Quantity $ quantity TQuantity.Pound v
+         "파운즈" -> Just . Token Quantity $ quantity TQuantity.Pound v
+         "접1시"      -> Just . Token Quantity $ quantity TQuantity.Dish v
+         "그릇"       -> Just . Token Quantity $ quantity TQuantity.Bowl v
+         "컵"             -> Just . Token Quantity $ quantity TQuantity.Cup v
          _                    -> Nothing
       _ -> Nothing
   }
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Quantity.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/PT/Rules.hs b/Duckling/Quantity/PT/Rules.hs
--- a/Duckling/Quantity/PT/Rules.hs
+++ b/Duckling/Quantity/PT/Rules.hs
@@ -46,7 +46,7 @@
   { name = "<quantity> of product"
   , pattern =
     [ dimension Quantity
-    , regex "de (caf(e|\x00e9)|a(\x00e7|c)ucar)"
+    , regex "de (caf(e|é)|a(ç|c)ucar)"
     ]
   , prod = \tokens -> case tokens of
       (Token Quantity qd:
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Quantity.Types
 import Duckling.Resolve
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/RO/Rules.hs b/Duckling/Quantity/RO/Rules.hs
--- a/Duckling/Quantity/RO/Rules.hs
+++ b/Duckling/Quantity/RO/Rules.hs
@@ -28,7 +28,7 @@
   { name = "<number> <units>"
   , pattern =
     [ dimension Numeral
-    , regex "livr(a|e|\x0103)"
+    , regex "livr(a|e|ă)"
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData {TNumeral.value = v}:_) ->
@@ -41,7 +41,7 @@
   { name = "<quantity> of product"
   , pattern =
     [ dimension Quantity
-    , regex "de (carne|can(a|\x0103)|zah(a|\x0103)r)"
+    , regex "de (carne|can(a|ă)|zah(a|ă)r)"
     ]
   , prod = \tokens -> case tokens of
       (Token Quantity qd:
diff --git a/Duckling/Quantity/Types.hs b/Duckling/Quantity/Types.hs
--- a/Duckling/Quantity/Types.hs
+++ b/Duckling/Quantity/Types.hs
@@ -30,6 +30,7 @@
   | Custom Text
   | Dish
   | Gram
+  | Ounce
   | Pint
   | Pound
   | Quart
diff --git a/Duckling/Ranking/Classifiers.hs b/Duckling/Ranking/Classifiers.hs
--- a/Duckling/Ranking/Classifiers.hs
+++ b/Duckling/Ranking/Classifiers.hs
@@ -10,61 +10,73 @@
   ( classifiers
   ) where
 
-import Duckling.Lang
-import qualified Duckling.Ranking.Classifiers.AR as ARClassifiers
-import qualified Duckling.Ranking.Classifiers.CS as CSClassifiers
-import qualified Duckling.Ranking.Classifiers.DA as DAClassifiers
-import qualified Duckling.Ranking.Classifiers.DE as DEClassifiers
-import qualified Duckling.Ranking.Classifiers.EN as ENClassifiers
-import qualified Duckling.Ranking.Classifiers.ES as ESClassifiers
-import qualified Duckling.Ranking.Classifiers.ET as ETClassifiers
-import qualified Duckling.Ranking.Classifiers.FR as FRClassifiers
-import qualified Duckling.Ranking.Classifiers.GA as GAClassifiers
-import qualified Duckling.Ranking.Classifiers.HE as HEClassifiers
-import qualified Duckling.Ranking.Classifiers.HR as HRClassifiers
-import qualified Duckling.Ranking.Classifiers.ID as IDClassifiers
-import qualified Duckling.Ranking.Classifiers.IT as ITClassifiers
-import qualified Duckling.Ranking.Classifiers.JA as JAClassifiers
-import qualified Duckling.Ranking.Classifiers.KO as KOClassifiers
-import qualified Duckling.Ranking.Classifiers.MY as MYClassifiers
-import qualified Duckling.Ranking.Classifiers.NB as NBClassifiers
-import qualified Duckling.Ranking.Classifiers.NL as NLClassifiers
-import qualified Duckling.Ranking.Classifiers.PL as PLClassifiers
-import qualified Duckling.Ranking.Classifiers.PT as PTClassifiers
-import qualified Duckling.Ranking.Classifiers.RO as ROClassifiers
-import qualified Duckling.Ranking.Classifiers.RU as RUClassifiers
-import qualified Duckling.Ranking.Classifiers.SV as SVClassifiers
-import qualified Duckling.Ranking.Classifiers.TR as TRClassifiers
-import qualified Duckling.Ranking.Classifiers.UK as UKClassifiers
-import qualified Duckling.Ranking.Classifiers.VI as VIClassifiers
-import qualified Duckling.Ranking.Classifiers.ZH as ZHClassifiers
+import Data.Maybe
+
+import Duckling.Locale
 import Duckling.Ranking.Types
+import qualified Duckling.Ranking.Classifiers.AR_XX as AR_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.BG_XX as BG_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.CS_XX as CS_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.DA_XX as DA_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.DE_XX as DE_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.EN_GB as EN_GBClassifiers
+import qualified Duckling.Ranking.Classifiers.EN_US as EN_USClassifiers
+import qualified Duckling.Ranking.Classifiers.EN_XX as EN_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.ES_XX as ES_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.ET_XX as ET_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.FR_XX as FR_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.GA_XX as GA_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.HE_XX as HE_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.HR_XX as HR_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.HU_XX as HU_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.ID_XX as ID_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.IT_XX as IT_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.JA_XX as JA_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.KA_XX as KA_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.KO_XX as KO_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.MY_XX as MY_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.NB_XX as NB_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.NL_XX as NL_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.PL_XX as PL_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.PT_XX as PT_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.RO_XX as RO_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.RU_XX as RU_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.SV_XX as SV_XXClassifiers
+import qualified Duckling.Ranking.Classifiers.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
+import qualified Duckling.Ranking.Classifiers.ZH_XX as ZH_XXClassifiers
 
-classifiers :: Lang -> Classifiers
-classifiers AR = ARClassifiers.classifiers
-classifiers CS = CSClassifiers.classifiers
-classifiers DA = DAClassifiers.classifiers
-classifiers DE = DEClassifiers.classifiers
-classifiers EN = ENClassifiers.classifiers
-classifiers ES = ESClassifiers.classifiers
-classifiers ET = ETClassifiers.classifiers
-classifiers FR = FRClassifiers.classifiers
-classifiers GA = GAClassifiers.classifiers
-classifiers HE = HEClassifiers.classifiers
-classifiers HR = HRClassifiers.classifiers
-classifiers ID = IDClassifiers.classifiers
-classifiers IT = ITClassifiers.classifiers
-classifiers JA = JAClassifiers.classifiers
-classifiers KO = KOClassifiers.classifiers
-classifiers MY = MYClassifiers.classifiers
-classifiers NB = NBClassifiers.classifiers
-classifiers NL = NLClassifiers.classifiers
-classifiers PL = PLClassifiers.classifiers
-classifiers PT = PTClassifiers.classifiers
-classifiers RO = ROClassifiers.classifiers
-classifiers RU = RUClassifiers.classifiers
-classifiers SV = SVClassifiers.classifiers
-classifiers TR = TRClassifiers.classifiers
-classifiers UK = UKClassifiers.classifiers
-classifiers VI = VIClassifiers.classifiers
-classifiers ZH = ZHClassifiers.classifiers
+classifiers :: Locale -> Classifiers
+classifiers (Locale AR _) = AR_XXClassifiers.classifiers
+classifiers (Locale BG _) = BG_XXClassifiers.classifiers
+classifiers (Locale CS _) = CS_XXClassifiers.classifiers
+classifiers (Locale DA _) = DA_XXClassifiers.classifiers
+classifiers (Locale DE _) = DE_XXClassifiers.classifiers
+classifiers (Locale EN (Just GB)) = EN_GBClassifiers.classifiers
+classifiers (Locale EN (Just US)) = EN_USClassifiers.classifiers
+classifiers (Locale EN _) = EN_XXClassifiers.classifiers
+classifiers (Locale ES _) = ES_XXClassifiers.classifiers
+classifiers (Locale ET _) = ET_XXClassifiers.classifiers
+classifiers (Locale FR _) = FR_XXClassifiers.classifiers
+classifiers (Locale GA _) = GA_XXClassifiers.classifiers
+classifiers (Locale HE _) = HE_XXClassifiers.classifiers
+classifiers (Locale HR _) = HR_XXClassifiers.classifiers
+classifiers (Locale HU _) = HU_XXClassifiers.classifiers
+classifiers (Locale ID _) = ID_XXClassifiers.classifiers
+classifiers (Locale IT _) = IT_XXClassifiers.classifiers
+classifiers (Locale JA _) = JA_XXClassifiers.classifiers
+classifiers (Locale KA _) = KA_XXClassifiers.classifiers
+classifiers (Locale KO _) = KO_XXClassifiers.classifiers
+classifiers (Locale MY _) = MY_XXClassifiers.classifiers
+classifiers (Locale NB _) = NB_XXClassifiers.classifiers
+classifiers (Locale NL _) = NL_XXClassifiers.classifiers
+classifiers (Locale PL _) = PL_XXClassifiers.classifiers
+classifiers (Locale PT _) = PT_XXClassifiers.classifiers
+classifiers (Locale RO _) = RO_XXClassifiers.classifiers
+classifiers (Locale RU _) = RU_XXClassifiers.classifiers
+classifiers (Locale SV _) = SV_XXClassifiers.classifiers
+classifiers (Locale TR _) = TR_XXClassifiers.classifiers
+classifiers (Locale UK _) = UK_XXClassifiers.classifiers
+classifiers (Locale VI _) = VI_XXClassifiers.classifiers
+classifiers (Locale ZH _) = ZH_XXClassifiers.classifiers
diff --git a/Duckling/Ranking/Classifiers/AR.hs b/Duckling/Ranking/Classifiers/AR.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/AR.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.AR (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/AR_XX.hs b/Duckling/Ranking/Classifiers/AR_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/AR_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.AR_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/BG_XX.hs b/Duckling/Ranking/Classifiers/BG_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/BG_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.BG_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/CS.hs b/Duckling/Ranking/Classifiers/CS.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/CS.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.CS (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/CS_XX.hs b/Duckling/Ranking/Classifiers/CS_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/CS_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.CS_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/DA.hs b/Duckling/Ranking/Classifiers/DA.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/DA.hs
+++ /dev/null
@@ -1,1566 +0,0 @@
--- 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.DA (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.2039728043259361),
-                                    ("hh:mm", -1.6094379124341003), ("hour", -1.6094379124341003),
-                                    ("minute", -1.2039728043259361)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.778087857209029, unseen = -4.962844630259907,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 141},
-                   koData =
-                     ClassData{prior = -0.6148599592306538, unseen = -5.123963979403259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 166}}),
-       ("the day before yesterday",
-        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}}),
-       ("lunch",
-        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> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.0986122886681098),
-                                    ("tomorrowevening", -2.0149030205422647),
-                                    ("named-daymorning", -2.0149030205422647),
-                                    ("tomorrowlunch", -2.0149030205422647),
-                                    ("yesterdayevening", -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -1.1786549963416462),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -1.1786549963416462)],
-                               n = 3}}),
-       ("dd/mm",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("today",
-        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}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.25593337413720063,
-                               unseen = -4.6443908991413725,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.536116699561526),
-                                    ("time-of-day (latent)", -1.2007417837444896),
-                                    ("relative minutes after|past <integer> (hour-of-day)",
-                                     -3.536116699561526),
-                                    ("hh:mm", -2.069779630768099),
-                                    ("<time-of-day> sharp", -3.536116699561526),
-                                    ("hour", -1.1382214267631554), ("minute", -1.8015156441734197)],
-                               n = 48},
-                   koData =
-                     ClassData{prior = -1.488077055429833, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.8472978603872037),
-                                    ("hour", -0.8472978603872037)],
-                               n = 14}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        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}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("the <day-of-month> (non ordinal)", -2.6149597780361984),
-                                    ("<day-of-month>(ordinal) <named-month>", -1.7676619176489945),
-                                    ("day", -0.7691330875378672),
-                                    ("the <day-of-month> (ordinal)", -3.0204248861443626),
-                                    ("named-day", -1.410986973710262)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -3.7376696182833684,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 40},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.9808292530117262),
-                                    ("hh:mmhh:mm", -0.9808292530117262)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 2}}),
-       ("between <datetime> and <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
-                                    ("minuteminute", -1.7047480922384253),
-                                    ("minutehour", -1.2992829841302609),
-                                    ("hh:mmintersect", -1.7047480922384253)],
-                               n = 3}}),
-       ("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 = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -1.252762968495368),
-                                    ("integer (0..19)minute (grain)", -1.252762968495368),
-                                    ("minute", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        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}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -2.3025850929940455,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
-                                    ("quarter", -0.8472978603872037),
-                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
-                                    ("quarter", -0.8472978603872037),
-                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
-                               n = 2}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.46117571512217015, unseen = -5.8111409929767,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.0163830207523885),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.0163830207523885),
-                                    ("hourday", -5.1149953094204985),
-                                    ("dayhour", -2.863703510814003),
-                                    ("daymonth", -3.3232358401924436),
-                                    ("monthyear", -3.0355537677406628),
-                                    ("intersecthh:mm", -5.1149953094204985),
-                                    ("the <day-of-month> (ordinal)named-month",
-                                     -3.8622323409251305),
-                                    ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -4.709530201312334),
-                                    ("last <day-of-week> of <time>year", -4.709530201312334),
-                                    ("todayat <time-of-day>", -4.709530201312334),
-                                    ("dayday", -3.0355537677406628),
-                                    ("dd/mmat <time-of-day>", -4.198704577546343),
-                                    ("intersect by \",\"hh:mm", -4.198704577546343),
-                                    ("intersectnamed-month", -5.1149953094204985),
-                                    ("dayyear", -3.243193132518907),
-                                    ("named-daythis <time>", -3.6109179126442243),
-                                    ("tomorrow<time-of-day> sharp", -4.709530201312334),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.709530201312334),
-                                    ("named-day<time> timezone", -4.421848128860553),
-                                    ("named-monthyear", -3.0355537677406628),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.0163830207523885),
-                                    ("tomorrowuntil <time-of-day>", -4.709530201312334),
-                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.421848128860553),
-                                    ("after <time-of-day>at <time-of-day>", -4.709530201312334),
-                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -4.709530201312334),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -5.1149953094204985),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -5.1149953094204985),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -4.709530201312334),
-                                    ("named-daynext <cycle>", -5.1149953094204985),
-                                    ("named-dayintersect", -5.1149953094204985),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.709530201312334),
-                                    ("tomorrowafter <time-of-day>", -4.709530201312334),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.198704577546343),
-                                    ("dayminute", -2.763620052257021),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -4.421848128860553),
-                                    ("<ordinal> <cycle> of <time>year", -4.709530201312334),
-                                    ("minuteday", -2.512305623976115),
-                                    ("absorption of , after named dayintersect",
-                                     -5.1149953094204985),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.1149953094204985),
-                                    ("named-dayon <date>", -5.1149953094204985),
-                                    ("named-dayat <time-of-day>", -4.709530201312334),
-                                    ("yearhh:mm", -5.1149953094204985),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -5.1149953094204985),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -4.709530201312334),
-                                    ("dd/mmyear", -4.709530201312334),
-                                    ("at <time-of-day>on <date>", -5.1149953094204985),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -5.1149953094204985),
-                                    ("between <datetime> and <datetime> (interval)on <date>",
-                                     -5.1149953094204985),
-                                    ("dayweek", -4.0163830207523885),
-                                    ("weekyear", -4.198704577546343),
-                                    ("hh:mmtomorrow", -4.421848128860553),
-                                    ("tomorrowat <time-of-day>", -3.8622323409251305),
-                                    ("named-daythe <day-of-month> (ordinal)", -5.1149953094204985),
-                                    ("at <time-of-day>tomorrow", -4.709530201312334),
-                                    ("last <cycle> of <time>year", -4.198704577546343),
-                                    ("named-daythe <day-of-month> (non ordinal)",
-                                     -5.1149953094204985),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.709530201312334),
-                                    ("yearminute", -5.1149953094204985)],
-                               n = 128},
-                   koData =
-                     ClassData{prior = -0.9957178655054769, unseen = -5.429345628954441,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -4.7318028369214575),
-                                    ("dayhour", -3.3455084758015667),
-                                    ("daymonth", -2.129113151477074),
-                                    ("monthday", -3.8155121050473024),
-                                    ("monthyear", -3.8155121050473024),
-                                    ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -3.4790398684260895),
-                                    ("named-dayhh:mm", -4.7318028369214575),
-                                    ("dd/mmat <time-of-day>", -3.8155121050473024),
-                                    ("hourhour", -3.4790398684260895),
-                                    ("dayyear", -3.3455084758015667),
-                                    ("named-daythis <time>", -2.5917366734251868),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -4.326337728813293),
-                                    ("minutemonth", -4.326337728813293),
-                                    ("named-monthyear", -3.8155121050473024),
-                                    ("in|during the <part-of-day>until <time-of-day>",
-                                     -4.326337728813293),
-                                    ("absorption of , after named daynamed-month",
-                                     -3.6331905482533475),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -4.326337728813293),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -4.326337728813293),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.7318028369214575),
-                                    ("until <time-of-day>on <date>", -4.7318028369214575),
-                                    ("dayminute", -3.3455084758015667),
-                                    ("minuteday", -3.2277254401451834),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.7318028369214575),
-                                    ("named-dayat <time-of-day>", -3.8155121050473024),
-                                    ("hh:mmon <date>", -3.3455084758015667),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.7318028369214575),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -3.8155121050473024),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -3.8155121050473024),
-                                    ("this <part-of-day>until <time-of-day>", -4.326337728813293),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -4.326337728813293),
-                                    ("tomorrownoon", -4.7318028369214575),
-                                    ("this <time>until <time-of-day>", -4.326337728813293),
-                                    ("minuteyear", -4.326337728813293),
-                                    ("yearminute", -4.326337728813293)],
-                               n = 75}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7346010553881064),
-                                    ("ordinals (first..31st)week (grain)intersect",
-                                     -1.7346010553881064),
-                                    ("ordinals (first..31st)week (grain)named-month",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.2237754316221157),
-                                    ("ordinals (first..31st)day (grain)named-month",
-                                     -1.7346010553881064)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("season",
-        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}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.4350845252893227),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.3513752571634776),
-                                    ("hh:mmhh:mm", -1.4350845252893227),
-                                    ("hourhour", -2.3513752571634776)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.4418327522790392,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.6741486494265287),
-                                    ("hh:mmtime-of-day (latent)", -1.7578579175523736),
-                                    ("minuteminute", -1.9810014688665833),
-                                    ("yearyear", -2.6741486494265287),
-                                    ("year (latent)year (latent)", -2.6741486494265287),
-                                    ("minutehour", -1.7578579175523736),
-                                    ("hh:mmintersect", -1.9810014688665833),
-                                    ("year (latent)time-of-day (latent)", -2.6741486494265287)],
-                               n = 9}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003),
-                                    ("month (grain)", -2.3025850929940455),
-                                    ("year (grain)", -2.3025850929940455),
-                                    ("week (grain)", -1.6094379124341003),
-                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
-                                    ("month", -2.3025850929940455),
-                                    ("quarter (grain)", -2.3025850929940455)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               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.6061358035703156,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
-       ("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 = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.4462871026284195),
-                                    ("integer (0..19)", -1.0216512475319814)],
-                               n = 23}}),
-       ("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.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)quarter (grain)year",
-                                     -1.252762968495368),
-                                    ("quarteryear", -0.8472978603872037),
-                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after lunch",
-        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}}),
-       ("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}}),
-       ("the <cycle> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (grain)christmas eve", -0.6931471805599453),
-                                    ("yearday", -0.6931471805599453)],
-                               n = 2}}),
-       ("quarter to|till|before <integer> (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}}),
-       ("a pair",
-        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> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7472144018302211),
-                                    ("ordinals (first..31st)named-dayintersect",
-                                     -0.9985288301111273),
-                                    ("ordinals (first..31st)named-daynamed-month",
-                                     -1.845826690498331)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7621400520468967),
-                                    ("ordinals (first..31st)named-daynamed-month",
-                                     -0.7621400520468967)],
-                               n = 6}}),
-       ("the <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..31st)",
-        Classifier{okData =
-                     ClassData{prior = -5.406722127027582e-2,
-                               unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -2.9444389791664407,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.189654742026425,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 64},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (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}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8472978603872037), ("evening", -1.252762968495368),
-                                    ("morning", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7308875085427924),
-                                    ("morning", -0.7308875085427924)],
-                               n = 12}}),
-       ("christmas 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}}),
-       ("<day-of-month>(ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -1.749199854809259),
-                                    ("ordinal (digits)named-month", -1.0560526742493137),
-                                    ("month", -0.7375989431307791)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -2.3978952727983707, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -0.916290731874155),
-                                    ("month", -0.916290731874155)],
-                               n = 1}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 28}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("afternoon", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("evening", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7672551527136672),
-                                    ("morning", -0.7672551527136672)],
-                               n = 12}}),
-       ("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}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (grain)christmas eve", -0.6931471805599453),
-                                    ("yearday", -0.6931471805599453)],
-                               n = 2}}),
-       ("<time> after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)", -1.2039728043259361),
-                                    ("ordinal (digits)", -0.35667494393873245)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("afternoon",
-        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> from now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("second", -1.4469189829363254), ("year", -2.1400661634962708),
-                                    ("<integer> <unit-of-duration>", -1.041453874828161),
-                                    ("a <unit-of-duration>", -2.1400661634962708),
-                                    ("minute", -1.7346010553881064)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5686159179138452),
-                                    ("year (grain)", -2.0794415416798357),
-                                    ("week (grain)", -1.5686159179138452),
-                                    ("day", -2.4849066497880004), ("quarter", -2.4849066497880004),
-                                    ("year", -2.0794415416798357),
-                                    ("quarter (grain)", -2.4849066497880004),
-                                    ("day (grain)", -2.4849066497880004)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -2.1972245773362196,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.6094379124341003),
-                                    ("day (grain)", -1.6094379124341003)],
-                               n = 1}}),
-       ("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}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.3862943611198906),
-                                    ("hour", -1.3862943611198906),
-                                    ("<hour-of-day> half (as relative minutes)",
-                                     -1.3862943611198906),
-                                    ("minute", -1.3862943611198906)],
-                               n = 4}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.9711673420999893,
-                               unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -2.469261259037152e-2)],
-                               n = 39},
-                   koData =
-                     ClassData{prior = -0.475845904869964, unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.29783444391579894),
-                                    ("integer (0..19)", -1.3564413979702095)],
-                               n = 64}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.1431008436406733, unseen = -3.332204510175204,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -2.0149030205422647, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.0986122886681098),
-                                    ("daymonth", -0.7621400520468967),
-                                    ("named-dayintersect", -1.6094379124341003)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5408064559779265, unseen = -4.74493212836325,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.538973871058276),
-                                    ("integer (0..19)year (grain)", -3.349904087274605),
-                                    ("integer (numeric)day (grain)", -2.9444389791664407),
-                                    ("integer (0..19)hour (grain)", -4.04305126783455),
-                                    ("second", -2.9444389791664407),
-                                    ("integer (numeric)second (grain)", -4.04305126783455),
-                                    ("a pairhour (grain)", -4.04305126783455),
-                                    ("integer (numeric)year (grain)", -3.6375861597263857),
-                                    ("day", -2.338303175596125), ("year", -2.9444389791664407),
-                                    ("integer (numeric)week (grain)", -3.349904087274605),
-                                    ("integer (0..19)month (grain)", -4.04305126783455),
-                                    ("integer (0..19)second (grain)", -3.126760535960395),
-                                    ("hour", -2.9444389791664407), ("month", -3.6375861597263857),
-                                    ("integer (numeric)minute (grain)", -2.790288299339182),
-                                    ("integer (0..19)minute (grain)", -2.9444389791664407),
-                                    ("integer (numeric)month (grain)", -4.04305126783455),
-                                    ("minute", -2.2512917986064953),
-                                    ("integer (numeric)hour (grain)", -3.349904087274605),
-                                    ("integer (0..19)day (grain)", -2.9444389791664407),
-                                    ("integer (0..19)week (grain)", -2.9444389791664407)],
-                               n = 46},
-                   koData =
-                     ClassData{prior = -0.8729402910005413, unseen = -4.48863636973214,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6855773452501515),
-                                    ("integer (0..19)year (grain)", -3.378724525810097),
-                                    ("integer (numeric)day (grain)", -3.0910424533583156),
-                                    ("integer (0..19)hour (grain)", -3.784189633918261),
-                                    ("second", -2.867898902044106),
-                                    ("integer (numeric)second (grain)", -3.378724525810097),
-                                    ("integer (numeric)year (grain)", -3.0910424533583156),
-                                    ("day", -2.6855773452501515), ("year", -2.6855773452501515),
-                                    ("integer (numeric)week (grain)", -3.378724525810097),
-                                    ("integer (0..19)month (grain)", -3.0910424533583156),
-                                    ("integer (0..19)second (grain)", -3.378724525810097),
-                                    ("hour", -2.6855773452501515), ("month", -2.6855773452501515),
-                                    ("integer (numeric)minute (grain)", -3.378724525810097),
-                                    ("integer (0..19)minute (grain)", -3.378724525810097),
-                                    ("integer (numeric)month (grain)", -3.378724525810097),
-                                    ("minute", -2.867898902044106),
-                                    ("integer (numeric)hour (grain)", -2.867898902044106),
-                                    ("integer (0..19)day (grain)", -3.378724525810097),
-                                    ("integer (0..19)week (grain)", -3.0910424533583156)],
-                               n = 33}}),
-       ("<duration> after <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>christmas eve", -1.5040773967762742),
-                                    ("yearday", -0.8109302162163288),
-                                    ("<integer> <unit-of-duration>christmas eve",
-                                     -1.0986122886681098)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("integer (numeric)time-of-day (latent)", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("year (grain)", -2.4849066497880004),
-                                    ("second", -2.0794415416798357),
-                                    ("week (grain)", -2.0794415416798357),
-                                    ("day", -2.4849066497880004),
-                                    ("minute (grain)", -2.4849066497880004),
-                                    ("year", -2.4849066497880004),
-                                    ("second (grain)", -2.0794415416798357),
-                                    ("minute", -2.4849066497880004),
-                                    ("day (grain)", -2.4849066497880004)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.1590646946296874, unseen = -4.442651256490317,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>named-day", -3.7376696182833684),
-                                    ("intersect by \",\"year", -3.7376696182833684),
-                                    ("hh:mmintersect by \",\"", -3.7376696182833684),
-                                    ("dayday", -2.032921526044943),
-                                    ("hh:mmnamed-day", -3.7376696182833684),
-                                    ("named-dayintersect by \",\"", -3.332204510175204),
-                                    ("dayyear", -2.8213788864092133),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -3.7376696182833684),
-                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -3.332204510175204),
-                                    ("<named-month> <day-of-month> (non ordinal)named-day",
-                                     -3.7376696182833684),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -3.044522437723423),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -2.639057329615259),
-                                    ("hh:mmintersect", -3.7376696182833684),
-                                    ("intersect by \",\"intersect", -3.7376696182833684),
-                                    ("named-dayintersect", -3.7376696182833684),
-                                    ("at <time-of-day>intersect", -3.7376696182833684),
-                                    ("dayminute", -2.639057329615259),
-                                    ("intersectyear", -3.7376696182833684),
-                                    ("minuteday", -2.032921526044943),
-                                    ("hh:mmabsorption of , after named day", -3.7376696182833684),
-                                    ("at <time-of-day>intersect by \",\"", -3.7376696182833684),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -3.7376696182833684),
-                                    ("intersectintersect", -3.7376696182833684),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -3.332204510175204)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -1.916922612182061, unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.791759469228055),
-                                    ("daymonth", -1.791759469228055)],
-                               n = 5}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -1.8018505502678365e-2,
-                               unseen = -4.04305126783455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 55},
-                   koData =
-                     ClassData{prior = -4.02535169073515, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <integer> (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}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.276666119016055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 70},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (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}}),
-       ("<time-of-day> sharp",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.2992829841302609),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.8209805520698302,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.7578579175523736),
-                                    ("daymonth", -1.4213856809311607),
-                                    ("named-daylast <cycle>", -2.6741486494265287),
-                                    ("named-daynext <cycle>", -2.6741486494265287),
-                                    ("named-dayintersect", -2.268683541318364),
-                                    ("dayweek", -1.575536360758419),
-                                    ("named-daythis <cycle>", -1.9810014688665833)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -0.579818495252942, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.3581234841531944),
-                                    ("daymonth", -0.8472978603872037),
-                                    ("named-dayintersect", -1.6094379124341003)],
-                               n = 14}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.580450375560848), ("day", -1.916922612182061),
-                                    ("year", -2.4277482359480516),
-                                    ("<integer> <unit-of-duration>", -0.8873031950009028),
-                                    ("a <unit-of-duration>", -2.833213344056216),
-                                    ("month", -2.4277482359480516)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -2.751535313041949, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.540445040947149), ("named-day", -1.540445040947149),
-                                    ("hour", -1.9459101490553135),
-                                    ("week-end", -1.9459101490553135)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -6.59579677917974e-2,
-                               unseen = -4.574710978503383,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -1.6199092123013958),
-                                    ("day", -2.367123614131617),
-                                    ("time-of-day (latent)", -1.6199092123013958),
-                                    ("year", -1.6199092123013958),
-                                    ("named-day", -2.9549102790337356),
-                                    ("intersect by \"of\", \"from\", \"'s\"", -2.9549102790337356),
-                                    ("hour", -1.6199092123013958)],
-                               n = 44}}),
-       ("the day after tomorrow",
-        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}}),
-       ("noon",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -0.8649974374866046),
-                                    ("hour", -0.8649974374866046)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.5040773967762742),
-                                    ("hh:mm", -1.5040773967762742),
-                                    ("minute", -1.0986122886681098)],
-                               n = 2}}),
-       ("<integer> and an half hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.6931471805599453),
-                                    ("integer (0..19)", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("evening",
-        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}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.9459101490553135),
-                                    ("day", -1.0296194171811581),
-                                    ("named-day", -1.0296194171811581),
-                                    ("month", -1.9459101490553135)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.8109302162163288,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716),
-                                    ("month (grain)", -2.0794415416798357),
-                                    ("year (grain)", -2.0794415416798357),
-                                    ("week (grain)", -1.6739764335716716),
-                                    ("year", -2.0794415416798357), ("month", -2.0794415416798357)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716),
-                                    ("week (grain)", -1.6739764335716716),
-                                    ("day", -1.6739764335716716),
-                                    ("day (grain)", -1.6739764335716716)],
-                               n = 4}}),
-       ("christmas",
-        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 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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.793208009442517),
-                                    ("integer (0..19)year (grain)", -3.1986731175506815),
-                                    ("integer (numeric)day (grain)", -3.1986731175506815),
-                                    ("integer (0..19)hour (grain)", -3.1986731175506815),
-                                    ("second", -2.793208009442517),
-                                    ("integer (numeric)second (grain)", -3.1986731175506815),
-                                    ("integer (numeric)year (grain)", -3.1986731175506815),
-                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
-                                    ("integer (numeric)week (grain)", -3.1986731175506815),
-                                    ("integer (0..19)month (grain)", -3.1986731175506815),
-                                    ("integer (0..19)second (grain)", -3.1986731175506815),
-                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
-                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
-                                    ("integer (0..19)minute (grain)", -3.1986731175506815),
-                                    ("integer (numeric)month (grain)", -3.1986731175506815),
-                                    ("minute", -2.793208009442517),
-                                    ("integer (numeric)hour (grain)", -3.1986731175506815),
-                                    ("integer (0..19)day (grain)", -3.1986731175506815),
-                                    ("integer (0..19)week (grain)", -3.1986731175506815)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.418840607796598,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.0204248861443626),
-                                    ("<integer> more <unit-of-duration>", -3.3081069585961433),
-                                    ("number.number hours", -3.713572066704308),
-                                    ("second", -2.797281334830153), ("day", -2.6149597780361984),
-                                    ("half an hour", -3.713572066704308),
-                                    ("<integer> <unit-of-duration>", -1.2286654169163076),
-                                    ("a <unit-of-duration>", -2.797281334830153),
-                                    ("<integer> and an half hours", -3.3081069585961433),
-                                    ("hour", -2.6149597780361984), ("minute", -1.4622802680978126),
-                                    ("about <duration>", -3.3081069585961433)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6649763035932491, unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.252762968495368),
-                                    ("hh:mmhh:mm", -1.252762968495368),
-                                    ("dayday", -2.1000608288825715),
-                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
-                                     -2.1000608288825715)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -0.7221347174331976, unseen = -3.871201010907891,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -2.0583881324820035),
-                                    ("minuteminute", -1.9042374526547454),
-                                    ("hh:mmhh:mm", -3.1570004211501135),
-                                    ("dayyear", -2.751535313041949),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -2.751535313041949),
-                                    ("hh:mmintersect", -2.0583881324820035),
-                                    ("dd/mmyear", -2.751535313041949),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -2.0583881324820035),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -2.751535313041949),
-                                    ("minuteyear", -2.751535313041949),
-                                    ("yearminute", -2.751535313041949)],
-                               n = 17}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.7672551527136672,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.7621400520468967),
-                                    ("hh:mmhh:mm", -0.7621400520468967)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -0.6241543090729939,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.8183103235139514),
-                                    ("minuteminute", -2.833213344056216),
-                                    ("hh:mmhh:mm", -2.833213344056216),
-                                    ("minutehour", -0.8183103235139514)],
-                               n = 15}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("integer (0..19)year (grain)", -3.332204510175204),
-                                    ("integer (numeric)day (grain)", -2.9267394020670396),
-                                    ("second", -2.9267394020670396),
-                                    ("integer (numeric)second (grain)", -3.332204510175204),
-                                    ("integer (numeric)year (grain)", -2.9267394020670396),
-                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
-                                    ("integer (numeric)week (grain)", -3.332204510175204),
-                                    ("integer (0..19)month (grain)", -2.9267394020670396),
-                                    ("integer (0..19)second (grain)", -3.332204510175204),
-                                    ("hour", -2.9267394020670396), ("month", -2.639057329615259),
-                                    ("integer (numeric)minute (grain)", -3.332204510175204),
-                                    ("integer (0..19)minute (grain)", -3.332204510175204),
-                                    ("integer (numeric)month (grain)", -3.332204510175204),
-                                    ("minute", -2.9267394020670396),
-                                    ("integer (numeric)hour (grain)", -2.9267394020670396),
-                                    ("integer (0..19)day (grain)", -3.332204510175204),
-                                    ("integer (0..19)week (grain)", -2.9267394020670396)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 5}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 3}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3}}),
-       ("<hour-of-day> half (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about <time-of-day>", -1.7346010553881064),
-                                    ("time-of-day (latent)", -1.041453874828161),
-                                    ("hour", -0.7537718023763802)],
-                               n = 7}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter (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}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.4816045409242156),
-                                    ("week (grain)named-month", -1.9924301646902063),
-                                    ("day (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.4816045409242156),
-                                    ("day (grain)named-month", -1.9924301646902063),
-                                    ("week (grain)intersect", -1.9924301646902063)],
-                               n = 8},
-                   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 = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -1.0986122886681098),
-                                    ("ordinal (digits)named-month", -1.5040773967762742),
-                                    ("month", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("morning",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("week-end",
-        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}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.7537718023763802, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.6863989535702288),
-                                    ("intersect", -2.1972245773362196),
-                                    ("tomorrow", -2.1972245773362196), ("day", -2.1972245773362196),
-                                    ("hour", -1.349926716949016)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.6359887667199967,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("this <part-of-day>", -2.268683541318364),
-                                    ("christmas eve", -2.268683541318364),
-                                    ("in|during the <part-of-day>", -2.268683541318364),
-                                    ("day", -2.268683541318364), ("hh:mm", -2.6741486494265287),
-                                    ("hour", -1.4213856809311607), ("minute", -2.6741486494265287),
-                                    ("this <time>", -2.268683541318364)],
-                               n = 9}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = -4.8790164169432056e-2,
-                               unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
-                   koData =
-                     ClassData{prior = -3.044522437723423, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (numeric)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 10}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.3217558399823195, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.1972245773362196), ("intersect", -2.70805020110221),
-                                    ("season", -2.1972245773362196),
-                                    ("next <cycle>", -3.1135153092103742),
-                                    ("named-month", -2.70805020110221),
-                                    ("day", -2.1972245773362196),
-                                    ("this <cycle>", -2.4203681286504293),
-                                    ("hour", -2.1972245773362196), ("evening", -3.1135153092103742),
-                                    ("month", -2.1972245773362196),
-                                    ("morning", -3.1135153092103742),
-                                    ("week-end", -2.70805020110221)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.3101549283038396, unseen = -4.624972813284271,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.0501711593797225),
-                                    ("named-month", -1.670681537674819),
-                                    ("time-of-day (latent)", -3.5165082281731497),
-                                    ("hour", -1.9070703157390494), ("month", -1.1811333123561132),
-                                    ("morning", -2.0501711593797225)],
-                               n = 44}}),
-       ("within <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/DA_XX.hs b/Duckling/Ranking/Classifiers/DA_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/DA_XX.hs
@@ -0,0 +1,1670 @@
+-- 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.DA_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.2039728043259361),
+                                    ("hh:mm", -1.6094379124341003), ("hour", -1.6094379124341003),
+                                    ("minute", -1.2039728043259361)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.778087857209029, unseen = -4.962844630259907,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 141},
+                   koData =
+                     ClassData{prior = -0.6148599592306538, unseen = -5.123963979403259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 166}}),
+       ("the day before yesterday",
+        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}}),
+       ("lunch",
+        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> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.0986122886681098),
+                                    ("tomorrowevening", -2.0149030205422647),
+                                    ("tomorrowlunch", -2.0149030205422647),
+                                    ("yesterdayevening", -2.0149030205422647),
+                                    ("Mondaymorning", -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -1.1786549963416462),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -1.1786549963416462)],
+                               n = 3}}),
+       ("dd/mm",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("today",
+        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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.25593337413720063,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.536116699561526),
+                                    ("time-of-day (latent)", -1.2007417837444896),
+                                    ("relative minutes after|past <integer> (hour-of-day)",
+                                     -3.536116699561526),
+                                    ("hh:mm", -2.069779630768099),
+                                    ("<time-of-day> sharp", -3.536116699561526),
+                                    ("hour", -1.1382214267631554), ("minute", -1.8015156441734197)],
+                               n = 48},
+                   koData =
+                     ClassData{prior = -1.488077055429833, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.8472978603872037),
+                                    ("hour", -0.8472978603872037)],
+                               n = 14}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.3978952727983707),
+                                    ("Saturday", -2.3978952727983707),
+                                    ("Monday", -1.7047480922384253),
+                                    ("Friday", -1.9924301646902063), ("day", -0.8938178760220964),
+                                    ("Sunday", -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        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}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.6817585740137264),
+                                    ("Saturday", -3.068052935133617),
+                                    ("Monday", -3.068052935133617),
+                                    ("the <day-of-month> (non ordinal)", -2.662587827025453),
+                                    ("<day-of-month>(ordinal) <named-month>", -1.8152899666382492),
+                                    ("day", -0.8167611365271219),
+                                    ("the <day-of-month> (ordinal)", -3.068052935133617)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.13976194237515874,
+                               unseen = -3.7376696182833684,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 40},
+                   koData =
+                     ClassData{prior = -2.03688192726104, 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.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.9808292530117262),
+                                    ("hh:mmhh:mm", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
+                                    ("minutehour", -0.9808292530117262)],
+                               n = 2}}),
+       ("between <datetime> and <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("hh:mmhh:mm", -1.0986122886681098)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
+                                    ("minuteminute", -1.7047480922384253),
+                                    ("minutehour", -1.2992829841302609),
+                                    ("hh:mmintersect", -1.7047480922384253)],
+                               n = 3}}),
+       ("October",
+        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}}),
+       ("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 = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)", -1.252762968495368),
+                                    ("integer (0..19)minute (grain)", -1.252762968495368),
+                                    ("minute", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> o'clock",
+        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}}),
+       ("Wednesday",
+        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}}),
+       ("July",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
+                                    ("quarter", -0.8472978603872037),
+                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
+                                    ("quarter", -0.8472978603872037),
+                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
+                               n = 2}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.43117346481837143,
+                               unseen = -5.820082930352362,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<datetime> - <datetime> (interval)on <date>",
+                                     -4.02535169073515),
+                                    ("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -5.123963979403259),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.02535169073515),
+                                    ("hourday", -5.123963979403259),
+                                    ("dayhour", -2.872672180796764),
+                                    ("daymonth", -3.332204510175204),
+                                    ("monthyear", -3.044522437723423),
+                                    ("Mondayon <date>", -5.123963979403259),
+                                    ("intersecthh:mm", -5.123963979403259),
+                                    ("Wednesdaynext <cycle>", -5.123963979403259),
+                                    ("Marchyear", -4.718498871295094),
+                                    ("intersect by \"of\", \"from\", \"'s\"year",
+                                     -4.718498871295094),
+                                    ("Mondayintersect", -5.123963979403259),
+                                    ("last <day-of-week> of <time>year", -4.718498871295094),
+                                    ("todayat <time-of-day>", -4.718498871295094),
+                                    ("Thursday<time> timezone", -4.430816798843313),
+                                    ("dayday", -3.044522437723423),
+                                    ("dd/mmat <time-of-day>", -4.207673247529104),
+                                    ("the <day-of-month> (ordinal)February", -4.718498871295094),
+                                    ("intersect by \",\"hh:mm", -4.207673247529104),
+                                    ("Mondaythe <day-of-month> (non ordinal)", -5.123963979403259),
+                                    ("Thursdaybetween <time-of-day> and <time-of-day> (interval)",
+                                     -5.123963979403259),
+                                    ("dayyear", -3.2521618025016674),
+                                    ("Thursdaybetween <datetime> and <datetime> (interval)",
+                                     -5.123963979403259),
+                                    ("Thursdayat <time-of-day>", -4.718498871295094),
+                                    ("tomorrow<time-of-day> sharp", -4.718498871295094),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -4.718498871295094),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.02535169073515),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.718498871295094),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.718498871295094),
+                                    ("tomorrowuntil <time-of-day>", -4.718498871295094),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -4.430816798843313),
+                                    ("the <day-of-month> (ordinal)March", -4.207673247529104),
+                                    ("after <time-of-day>at <time-of-day>", -4.718498871295094),
+                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
+                                     -4.718498871295094),
+                                    ("Mondaythe <day-of-month> (ordinal)", -5.123963979403259),
+                                    ("tomorrowafter <time-of-day>", -4.718498871295094),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.207673247529104),
+                                    ("Sunday<day-of-month> (non ordinal) <named-month>",
+                                     -5.123963979403259),
+                                    ("dayminute", -2.772588722239781),
+                                    ("Tuesdaythis <time>", -4.430816798843313),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -4.430816798843313),
+                                    ("<ordinal> <cycle> of <time>year", -4.718498871295094),
+                                    ("minuteday", -2.521274293958875),
+                                    ("absorption of , after named dayintersect",
+                                     -5.123963979403259),
+                                    ("Octoberyear", -3.5145260669691587),
+                                    ("yearhh:mm", -5.123963979403259),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -4.718498871295094),
+                                    ("dd/mmyear", -4.718498871295094),
+                                    ("Septemberyear", -4.207673247529104),
+                                    ("at <time-of-day>on <date>", -5.123963979403259),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -5.123963979403259),
+                                    ("between <datetime> and <datetime> (interval)on <date>",
+                                     -5.123963979403259),
+                                    ("dayweek", -4.02535169073515),
+                                    ("weekyear", -4.207673247529104),
+                                    ("hh:mmtomorrow", -4.430816798843313),
+                                    ("Wednesdaythis <time>", -4.207673247529104),
+                                    ("tomorrowat <time-of-day>", -3.871201010907891),
+                                    ("at <time-of-day>tomorrow", -4.718498871295094),
+                                    ("intersectFebruary", -5.123963979403259),
+                                    ("last <cycle> of <time>year", -4.207673247529104),
+                                    ("Mondaythis <time>", -5.123963979403259),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -4.718498871295094),
+                                    ("yearminute", -5.123963979403259)],
+                               n = 128},
+                   koData =
+                     ClassData{prior = -1.049097224140729, unseen = -5.389071729816501,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.305053521109253),
+                                    ("daymonth", -2.0886581967847597),
+                                    ("monthday", -3.775057150354989),
+                                    ("monthyear", -3.775057150354989),
+                                    ("Marchyear", -3.9982007016691985),
+                                    ("intersect by \"of\", \"from\", \"'s\"year",
+                                     -3.438584913733776),
+                                    ("Sundaythis <time>", -3.775057150354989),
+                                    ("absorption of , after named dayJuly", -4.285882774120979),
+                                    ("dd/mmat <time-of-day>", -3.775057150354989),
+                                    ("hourhour", -3.438584913733776),
+                                    ("Thursdaybetween <time-of-day> and <time-of-day> (interval)",
+                                     -4.6913478822291435),
+                                    ("dayyear", -3.305053521109253),
+                                    ("Thursdaybetween <datetime> and <datetime> (interval)",
+                                     -4.6913478822291435),
+                                    ("Thursdayat <time-of-day>", -3.775057150354989),
+                                    ("Thursdayhh:mm", -4.6913478822291435),
+                                    ("WednesdayFebruary", -4.6913478822291435),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.285882774120979),
+                                    ("in|during the <part-of-day>until <time-of-day>",
+                                     -4.285882774120979),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.6913478822291435),
+                                    ("Aprilyear", -4.6913478822291435),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -3.775057150354989),
+                                    ("until <time-of-day>on <date>", -4.6913478822291435),
+                                    ("August<day-of-month> (non ordinal) <named-month>",
+                                     -3.775057150354989),
+                                    ("dayminute", -3.305053521109253),
+                                    ("Tuesdaythis <time>", -3.775057150354989),
+                                    ("minuteday", -3.1872704854528697),
+                                    ("hh:mmon <date>", -3.305053521109253),
+                                    ("Wednesdaythis <time>", -3.438584913733776),
+                                    ("absorption of , after named dayFebruary",
+                                     -3.9982007016691985),
+                                    ("this <part-of-day>until <time-of-day>", -4.285882774120979),
+                                    ("tomorrownoon", -4.6913478822291435),
+                                    ("this <time>until <time-of-day>", -4.285882774120979),
+                                    ("Mondaythis <time>", -4.285882774120979)],
+                               n = 69}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7346010553881064),
+                                    ("ordinals (first..31st)week (grain)October",
+                                     -1.7346010553881064),
+                                    ("ordinals (first..31st)week (grain)intersect",
+                                     -1.7346010553881064),
+                                    ("weekmonth", -1.2237754316221157),
+                                    ("ordinals (first..31st)day (grain)October",
+                                     -1.7346010553881064)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("season",
+        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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.4350845252893227),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.3513752571634776),
+                                    ("hh:mmhh:mm", -1.4350845252893227),
+                                    ("hourhour", -2.3513752571634776)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.6741486494265287),
+                                    ("hh:mmtime-of-day (latent)", -1.7578579175523736),
+                                    ("minuteminute", -1.9810014688665833),
+                                    ("yearyear", -2.6741486494265287),
+                                    ("year (latent)year (latent)", -2.6741486494265287),
+                                    ("minutehour", -1.7578579175523736),
+                                    ("hh:mmintersect", -1.9810014688665833),
+                                    ("year (latent)time-of-day (latent)", -2.6741486494265287)],
+                               n = 9}}),
+       ("Saturday",
+        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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("month (grain)", -2.3025850929940455),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -1.6094379124341003),
+                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
+                                    ("month", -2.3025850929940455),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               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.6061358035703156,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hh:mmhh:mm", -1.0986122886681098),
+                                    ("hourhour", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
+                                    ("minutehour", -0.9808292530117262)],
+                               n = 5}}),
+       ("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 = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4462871026284195),
+                                    ("integer (0..19)", -1.0216512475319814)],
+                               n = 23}}),
+       ("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.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.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)quarter (grain)year",
+                                     -1.252762968495368),
+                                    ("quarteryear", -0.8472978603872037),
+                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after lunch",
+        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}}),
+       ("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}}),
+       ("the <cycle> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (grain)christmas eve", -0.6931471805599453),
+                                    ("yearday", -0.6931471805599453)],
+                               n = 2}}),
+       ("quarter to|till|before <integer> (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}}),
+       ("a pair",
+        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> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8938178760220964),
+                                    ("ordinals (first..31st)TuesdayOctober", -1.9924301646902063),
+                                    ("ordinals (first..31st)Tuesdayintersect", -1.9924301646902063),
+                                    ("ordinals (first..31st)Wednesdayintersect",
+                                     -1.4816045409242156)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9444616088408514),
+                                    ("ordinals (first..31st)WednesdayOctober", -1.2809338454620642),
+                                    ("ordinals (first..31st)TuesdaySeptember", -1.791759469228055)],
+                               n = 6}}),
+       ("the <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..31st)",
+        Classifier{okData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("week (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}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8472978603872037), ("evening", -1.252762968495368),
+                                    ("morning", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7308875085427924),
+                                    ("morning", -0.7308875085427924)],
+                               n = 12}}),
+       ("christmas 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}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)March", -1.8325814637483102),
+                                    ("ordinal (digits)February", -1.8325814637483102),
+                                    ("month", -0.8209805520698302),
+                                    ("ordinal (digits)March", -1.6094379124341003)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)April", -1.252762968495368),
+                                    ("month", -1.252762968495368)],
+                               n = 1}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 28}}),
+       ("Friday",
+        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}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262),
+                                    ("evening", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7672551527136672),
+                                    ("morning", -0.7672551527136672)],
+                               n = 12}}),
+       ("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}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (grain)christmas eve", -0.6931471805599453),
+                                    ("yearday", -0.6931471805599453)],
+                               n = 2}}),
+       ("<time> 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}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)", -1.2039728043259361),
+                                    ("ordinal (digits)", -0.35667494393873245)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sunday",
+        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}}),
+       ("afternoon",
+        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> from now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second", -1.4469189829363254), ("year", -2.1400661634962708),
+                                    ("<integer> <unit-of-duration>", -1.041453874828161),
+                                    ("a <unit-of-duration>", -2.1400661634962708),
+                                    ("minute", -1.7346010553881064)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.5686159179138452),
+                                    ("year (grain)", -2.0794415416798357),
+                                    ("week (grain)", -1.5686159179138452),
+                                    ("day", -2.4849066497880004), ("quarter", -2.4849066497880004),
+                                    ("year", -2.0794415416798357),
+                                    ("quarter (grain)", -2.4849066497880004),
+                                    ("day (grain)", -2.4849066497880004)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.6094379124341003),
+                                    ("day (grain)", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.3862943611198906),
+                                    ("hour", -1.3862943611198906),
+                                    ("<hour-of-day> half (as relative minutes)",
+                                     -1.3862943611198906),
+                                    ("minute", -1.3862943611198906)],
+                               n = 4}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.8690378470236094,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -2.469261259037152e-2)],
+                               n = 39},
+                   koData =
+                     ClassData{prior = -0.5436154465889815, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2876820724517809),
+                                    ("integer (0..19)", -1.3862943611198906)],
+                               n = 54}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.1431008436406733, unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -2.0149030205422647, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8266785731844679),
+                                    ("SundayMarch", -1.6739764335716716),
+                                    ("MondayMarch", -1.6739764335716716),
+                                    ("Sundayintersect", -1.6739764335716716)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.5408064559779265, unseen = -4.74493212836325,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.538973871058276),
+                                    ("integer (0..19)year (grain)", -3.349904087274605),
+                                    ("integer (numeric)day (grain)", -2.9444389791664407),
+                                    ("integer (0..19)hour (grain)", -4.04305126783455),
+                                    ("second", -2.9444389791664407),
+                                    ("integer (numeric)second (grain)", -4.04305126783455),
+                                    ("a pairhour (grain)", -4.04305126783455),
+                                    ("integer (numeric)year (grain)", -3.6375861597263857),
+                                    ("day", -2.338303175596125), ("year", -2.9444389791664407),
+                                    ("integer (numeric)week (grain)", -3.349904087274605),
+                                    ("integer (0..19)month (grain)", -4.04305126783455),
+                                    ("integer (0..19)second (grain)", -3.126760535960395),
+                                    ("hour", -2.9444389791664407), ("month", -3.6375861597263857),
+                                    ("integer (numeric)minute (grain)", -2.790288299339182),
+                                    ("integer (0..19)minute (grain)", -2.9444389791664407),
+                                    ("integer (numeric)month (grain)", -4.04305126783455),
+                                    ("minute", -2.2512917986064953),
+                                    ("integer (numeric)hour (grain)", -3.349904087274605),
+                                    ("integer (0..19)day (grain)", -2.9444389791664407),
+                                    ("integer (0..19)week (grain)", -2.9444389791664407)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -0.8729402910005413, unseen = -4.48863636973214,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6855773452501515),
+                                    ("integer (0..19)year (grain)", -3.378724525810097),
+                                    ("integer (numeric)day (grain)", -3.0910424533583156),
+                                    ("integer (0..19)hour (grain)", -3.784189633918261),
+                                    ("second", -2.867898902044106),
+                                    ("integer (numeric)second (grain)", -3.378724525810097),
+                                    ("integer (numeric)year (grain)", -3.0910424533583156),
+                                    ("day", -2.6855773452501515), ("year", -2.6855773452501515),
+                                    ("integer (numeric)week (grain)", -3.378724525810097),
+                                    ("integer (0..19)month (grain)", -3.0910424533583156),
+                                    ("integer (0..19)second (grain)", -3.378724525810097),
+                                    ("hour", -2.6855773452501515), ("month", -2.6855773452501515),
+                                    ("integer (numeric)minute (grain)", -3.378724525810097),
+                                    ("integer (0..19)minute (grain)", -3.378724525810097),
+                                    ("integer (numeric)month (grain)", -3.378724525810097),
+                                    ("minute", -2.867898902044106),
+                                    ("integer (numeric)hour (grain)", -2.867898902044106),
+                                    ("integer (0..19)day (grain)", -3.378724525810097),
+                                    ("integer (0..19)week (grain)", -3.0910424533583156)],
+                               n = 33}}),
+       ("<duration> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>christmas eve", -1.5040773967762742),
+                                    ("yearday", -0.8109302162163288),
+                                    ("<integer> <unit-of-duration>christmas eve",
+                                     -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("integer (numeric)time-of-day (latent)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0794415416798357),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("second", -2.0794415416798357),
+                                    ("week (grain)", -2.0794415416798357),
+                                    ("day", -2.4849066497880004),
+                                    ("minute (grain)", -2.4849066497880004),
+                                    ("year", -2.4849066497880004),
+                                    ("second (grain)", -2.0794415416798357),
+                                    ("minute", -2.4849066497880004),
+                                    ("day (grain)", -2.4849066497880004)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874, unseen = -4.51085950651685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -3.8066624897703196),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -3.8066624897703196),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.4011973816621555),
+                                    ("at <time-of-day>Saturday", -3.8066624897703196),
+                                    ("intersect by \",\"year", -3.8066624897703196),
+                                    ("hh:mmintersect by \",\"", -3.8066624897703196),
+                                    ("dayday", -2.1019143975318944),
+                                    ("dayyear", -2.890371757896165),
+                                    ("Saturday<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("<named-month> <day-of-month> (non ordinal)intersect",
+                                     -3.8066624897703196),
+                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
+                                     -3.4011973816621555),
+                                    ("Fridayintersect", -3.8066624897703196),
+                                    ("hh:mmintersect", -3.8066624897703196),
+                                    ("intersect by \",\"intersect", -3.8066624897703196),
+                                    ("hh:mmSaturday", -3.8066624897703196),
+                                    ("at <time-of-day>intersect", -3.8066624897703196),
+                                    ("Sunday<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("dayminute", -2.70805020110221),
+                                    ("intersectyear", -3.8066624897703196),
+                                    ("minuteday", -2.1019143975318944),
+                                    ("hh:mmabsorption of , after named day", -3.8066624897703196),
+                                    ("at <time-of-day>intersect by \",\"", -3.8066624897703196),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -3.8066624897703196),
+                                    ("intersectintersect", -3.8066624897703196),
+                                    ("Fridayintersect by \",\"", -3.4011973816621555),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -3.4011973816621555),
+                                    ("Monday<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -3.4011973816621555)],
+                               n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.9459101490553135),
+                                    ("FridayJuly", -2.639057329615259),
+                                    ("WednesdayFebruary", -3.044522437723423),
+                                    ("MondayFebruary", -2.639057329615259)],
+                               n = 5}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -1.8018505502678365e-2,
+                               unseen = -4.04305126783455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 55},
+                   koData =
+                     ClassData{prior = -4.02535169073515, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter after|past <integer> (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}}),
+       ("second (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}}),
+       ("<time-of-day> sharp",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.2992829841302609),
+                                    ("time-of-day (latent)", -1.2992829841302609),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.8209805520698302,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sundaylast <cycle>", -2.917770732084279),
+                                    ("daymonth", -1.6650077635889111),
+                                    ("Wednesdayintersect", -2.512305623976115),
+                                    ("Wednesdaynext <cycle>", -2.917770732084279),
+                                    ("Tuesdaythis <cycle>", -2.917770732084279),
+                                    ("WednesdayOctober", -2.512305623976115),
+                                    ("Wednesdaythis <cycle>", -2.917770732084279),
+                                    ("TuesdayOctober", -2.512305623976115),
+                                    ("Mondaythis <cycle>", -2.917770732084279),
+                                    ("dayweek", -1.8191584434161694)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.579818495252942, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0531499145913523),
+                                    ("TuesdaySeptember", -2.662587827025453),
+                                    ("Wednesdayintersect", -2.662587827025453),
+                                    ("WednesdayOctober", -2.662587827025453),
+                                    ("SundayMarch", -2.662587827025453),
+                                    ("MondayMarch", -2.662587827025453),
+                                    ("Tuesdayintersect", -2.662587827025453),
+                                    ("Sundayintersect", -2.662587827025453)],
+                               n = 14}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.580450375560848), ("day", -1.916922612182061),
+                                    ("year", -2.4277482359480516),
+                                    ("<integer> <unit-of-duration>", -0.8873031950009028),
+                                    ("a <unit-of-duration>", -2.833213344056216),
+                                    ("month", -2.4277482359480516)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -2.751535313041949, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.6739764335716716), ("Sunday", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357), ("Tuesday", -2.0794415416798357),
+                                    ("week-end", -2.0794415416798357)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -6.59579677917974e-2, unseen = -4.59511985013459,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.6405284995041316),
+                                    ("Monday", -3.4863551900024623), ("day", -2.3877429013343523),
+                                    ("Sunday", -3.4863551900024623),
+                                    ("time-of-day (latent)", -1.6405284995041316),
+                                    ("year", -1.6405284995041316),
+                                    ("intersect by \"of\", \"from\", \"'s\"", -2.9755295662364714),
+                                    ("hour", -1.6405284995041316)],
+                               n = 44}}),
+       ("March",
+        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 day after tomorrow",
+        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}}),
+       ("noon",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -0.8649974374866046),
+                                    ("hour", -0.8649974374866046)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.5040773967762742,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.5040773967762742),
+                                    ("hh:mm", -1.5040773967762742),
+                                    ("minute", -1.0986122886681098)],
+                               n = 2}}),
+       ("<integer> and an half hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.6931471805599453),
+                                    ("integer (0..19)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("evening",
+        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}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.587786664902119, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.1400661634962708),
+                                    ("Monday", -2.1400661634962708), ("day", -1.2237754316221157),
+                                    ("March", -2.1400661634962708), ("month", -2.1400661634962708),
+                                    ("Tuesday", -1.7346010553881064)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.0149030205422647),
+                                    ("Friday", -1.6094379124341003), ("day", -1.3217558399823195),
+                                    ("March", -2.0149030205422647), ("month", -2.0149030205422647)],
+                               n = 4}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("month (grain)", -2.0794415416798357),
+                                    ("year (grain)", -2.0794415416798357),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("year", -2.0794415416798357), ("month", -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("day", -1.6739764335716716),
+                                    ("day (grain)", -1.6739764335716716)],
+                               n = 4}}),
+       ("christmas",
+        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 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}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.793208009442517),
+                                    ("integer (0..19)year (grain)", -3.1986731175506815),
+                                    ("integer (numeric)day (grain)", -3.1986731175506815),
+                                    ("integer (0..19)hour (grain)", -3.1986731175506815),
+                                    ("second", -2.793208009442517),
+                                    ("integer (numeric)second (grain)", -3.1986731175506815),
+                                    ("integer (numeric)year (grain)", -3.1986731175506815),
+                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
+                                    ("integer (numeric)week (grain)", -3.1986731175506815),
+                                    ("integer (0..19)month (grain)", -3.1986731175506815),
+                                    ("integer (0..19)second (grain)", -3.1986731175506815),
+                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
+                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
+                                    ("integer (0..19)minute (grain)", -3.1986731175506815),
+                                    ("integer (numeric)month (grain)", -3.1986731175506815),
+                                    ("minute", -2.793208009442517),
+                                    ("integer (numeric)hour (grain)", -3.1986731175506815),
+                                    ("integer (0..19)day (grain)", -3.1986731175506815),
+                                    ("integer (0..19)week (grain)", -3.1986731175506815)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.418840607796598,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.0204248861443626),
+                                    ("<integer> more <unit-of-duration>", -3.3081069585961433),
+                                    ("number.number hours", -3.713572066704308),
+                                    ("second", -2.797281334830153), ("day", -2.6149597780361984),
+                                    ("half an hour", -3.713572066704308),
+                                    ("<integer> <unit-of-duration>", -1.2286654169163076),
+                                    ("a <unit-of-duration>", -2.797281334830153),
+                                    ("<integer> and an half hours", -3.3081069585961433),
+                                    ("hour", -2.6149597780361984), ("minute", -1.4622802680978126),
+                                    ("about <duration>", -3.3081069585961433)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.5436154465889815,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.1895840668738362),
+                                    ("hh:mmhh:mm", -1.1895840668738362),
+                                    ("dayday", -2.03688192726104),
+                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
+                                     -2.03688192726104)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -0.8690378470236094,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July<day-of-month> (non ordinal) <named-month>",
+                                     -2.890371757896165),
+                                    ("monthday", -1.791759469228055),
+                                    ("minuteminute", -1.6376087894007967),
+                                    ("hh:mmhh:mm", -2.890371757896165),
+                                    ("dayyear", -2.4849066497880004),
+                                    ("hh:mmintersect", -1.791759469228055),
+                                    ("August<day-of-month> (non ordinal) <named-month>",
+                                     -1.9740810260220096),
+                                    ("dd/mmyear", -2.4849066497880004)],
+                               n = 13}}),
+       ("Tuesday",
+        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}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7672551527136672,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.7621400520468967),
+                                    ("hh:mmhh:mm", -0.7621400520468967)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6241543090729939,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.8183103235139514),
+                                    ("minuteminute", -2.833213344056216),
+                                    ("hh:mmhh:mm", -2.833213344056216),
+                                    ("minutehour", -0.8183103235139514)],
+                               n = 15}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.639057329615259),
+                                    ("integer (0..19)year (grain)", -3.332204510175204),
+                                    ("integer (numeric)day (grain)", -2.9267394020670396),
+                                    ("second", -2.9267394020670396),
+                                    ("integer (numeric)second (grain)", -3.332204510175204),
+                                    ("integer (numeric)year (grain)", -2.9267394020670396),
+                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
+                                    ("integer (numeric)week (grain)", -3.332204510175204),
+                                    ("integer (0..19)month (grain)", -2.9267394020670396),
+                                    ("integer (0..19)second (grain)", -3.332204510175204),
+                                    ("hour", -2.9267394020670396), ("month", -2.639057329615259),
+                                    ("integer (numeric)minute (grain)", -3.332204510175204),
+                                    ("integer (0..19)minute (grain)", -3.332204510175204),
+                                    ("integer (numeric)month (grain)", -3.332204510175204),
+                                    ("minute", -2.9267394020670396),
+                                    ("integer (numeric)hour (grain)", -2.9267394020670396),
+                                    ("integer (0..19)day (grain)", -3.332204510175204),
+                                    ("integer (0..19)week (grain)", -2.9267394020670396)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Aprilinteger (numeric)", -2.4423470353692043),
+                                    ("month", -0.832909122935104),
+                                    ("Februaryinteger (numeric)", -1.3437347467010947),
+                                    ("Julyinteger (numeric)", -1.749199854809259)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -1.0986122886681098),
+                                    ("Aprilinteger (numeric)", -2.0149030205422647),
+                                    ("month", -0.916290731874155)],
+                               n = 5}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)September", -3.068052935133617),
+                                    ("integer (numeric)April", -3.068052935133617),
+                                    ("integer (numeric)August", -1.4586150226995167),
+                                    ("integer (numeric)February", -2.374905754573672),
+                                    ("month", -0.8167611365271219),
+                                    ("integer (numeric)July", -2.662587827025453),
+                                    ("integer (numeric)March", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -1.1786549963416462),
+                                    ("integer (numeric)July", -1.1786549963416462)],
+                               n = 3}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Monday", -1.8718021769015913), ("day", -0.9555114450274363),
+                                    ("Tuesday", -1.466337068793427)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.7047480922384253),
+                                    ("Friday", -1.2992829841302609), ("day", -1.0116009116784799)],
+                               n = 3}}),
+       ("<hour-of-day> half (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about <time-of-day>", -1.7346010553881064),
+                                    ("time-of-day (latent)", -1.041453874828161),
+                                    ("hour", -0.7537718023763802)],
+                               n = 7}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter (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}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.9924301646902063),
+                                    ("daymonth", -1.4816045409242156),
+                                    ("day (grain)intersect", -1.9924301646902063),
+                                    ("weekmonth", -1.4816045409242156),
+                                    ("week (grain)intersect", -1.9924301646902063),
+                                    ("week (grain)September", -1.9924301646902063)],
+                               n = 8},
+                   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 = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)April", -1.6094379124341003),
+                                    ("ordinals (first..31st)March", -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)March", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("week-end",
+        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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.7537718023763802, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.6863989535702288),
+                                    ("intersect", -2.1972245773362196),
+                                    ("tomorrow", -2.1972245773362196), ("day", -2.1972245773362196),
+                                    ("hour", -1.349926716949016)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.6359887667199967,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this <part-of-day>", -2.268683541318364),
+                                    ("christmas eve", -2.268683541318364),
+                                    ("in|during the <part-of-day>", -2.268683541318364),
+                                    ("day", -2.268683541318364), ("hh:mm", -2.6741486494265287),
+                                    ("hour", -1.4213856809311607), ("minute", -2.6741486494265287),
+                                    ("this <time>", -2.268683541318364)],
+                               n = 9}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.8790164169432056e-2,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -3.044522437723423, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.3217558399823195, unseen = -3.871201010907891,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2407096892759584), ("October", -2.751535313041949),
+                                    ("intersect", -2.751535313041949),
+                                    ("season", -2.2407096892759584),
+                                    ("next <cycle>", -3.1570004211501135),
+                                    ("day", -2.2407096892759584),
+                                    ("this <cycle>", -2.463853240590168),
+                                    ("hour", -2.2407096892759584), ("evening", -3.1570004211501135),
+                                    ("month", -2.2407096892759584),
+                                    ("morning", -3.1570004211501135),
+                                    ("week-end", -2.751535313041949)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("September", -3.0252910757955354),
+                                    ("October", -2.236833715431265),
+                                    ("intersect", -2.069779630768099),
+                                    ("time-of-day (latent)", -3.536116699561526),
+                                    ("March", -3.0252910757955354), ("hour", -1.9266787871274258),
+                                    ("month", -1.2007417837444896),
+                                    ("morning", -2.069779630768099)],
+                               n = 44}}),
+       ("within <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August",
+        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}})]
diff --git a/Duckling/Ranking/Classifiers/DE.hs b/Duckling/Ranking/Classifiers/DE.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/DE.hs
+++ /dev/null
@@ -1,1934 +0,0 @@
--- 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.DE (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -1.3862943611198906),
-                                    ("hh:mm", -1.3862943611198906), ("hour", -1.3862943611198906),
-                                    ("minute", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.9179699933938751, unseen = -4.795790545596741,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 119},
-                   koData =
-                     ClassData{prior = -0.5097076806646496, unseen = -5.198497031265826,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 179}}),
-       ("exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.0986122886681098),
-                                    ("<time-of-day>  o'clock", -1.5040773967762742),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3},
-                   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,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("lunch",
-        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 (20..90)",
-        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> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -5.720311776607412,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clockmorning", -4.618415412738112),
-                                    ("until <time-of-day>afternoon", -5.0238805208462765),
-                                    ("dayhour", -3.319132428607851),
-                                    ("todayevening", -4.618415412738112),
-                                    ("half <integer> (german style hour-of-day)afternoon",
-                                     -5.0238805208462765),
-                                    ("<time-of-day>  o'clockafter lunch", -4.330733340286331),
-                                    ("intersect by ','evening", -3.5198031240700023),
-                                    ("<time-of-day>  o'clockon <date>", -3.925268232178167),
-                                    ("intersectevening", -1.9558275857126592),
-                                    ("time-of-day (latent)on <date>", -4.330733340286331),
-                                    ("about <time-of-day>on <date>", -4.618415412738112),
-                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
-                                     -4.618415412738112),
-                                    ("hourhour", -1.1952391243571814),
-                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
-                                     -3.925268232178167),
-                                    ("<time-of-day>  o'clockafternoon", -4.330733340286331),
-                                    ("half <integer> (german style hour-of-day)after lunch",
-                                     -5.0238805208462765),
-                                    ("until <time-of-day>morning", -4.618415412738112),
-                                    ("minutehour", -2.384823191231018),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -4.107589788972121),
-                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
-                                     -5.0238805208462765),
-                                    ("<time-of-day> am|pmmorning", -4.618415412738112),
-                                    ("tomorrowevening", -5.0238805208462765),
-                                    ("time-of-day (latent)morning", -5.0238805208462765),
-                                    ("named-daymorning", -4.618415412738112),
-                                    ("hh:mmmorning", -5.0238805208462765),
-                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
-                                     -4.618415412738112),
-                                    ("until <time-of-day>on <date>", -5.0238805208462765),
-                                    ("<day-of-month>(ordinal) <named-month>morning",
-                                     -5.0238805208462765),
-                                    ("<time-of-day>  o'clockevening", -5.0238805208462765),
-                                    ("hh:mmon <date>", -4.107589788972121),
-                                    ("<hour-of-day> <integer> (as relative minutes)afternoon",
-                                     -5.0238805208462765),
-                                    ("tomorrowlunch", -4.618415412738112),
-                                    ("until <time-of-day>after lunch", -5.0238805208462765),
-                                    ("at <time-of-day>on <date>", -4.107589788972121),
-                                    ("yesterdayevening", -5.0238805208462765),
-                                    ("intersectmorning", -5.0238805208462765),
-                                    ("hh:mmin|during the <part-of-day>", -4.107589788972121),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -4.330733340286331),
-                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
-                                     -4.618415412738112),
-                                    ("about <time-of-day>in|during the <part-of-day>",
-                                     -4.618415412738112),
-                                    ("half <integer> (german style hour-of-day)on <date>",
-                                     -4.618415412738112),
-                                    ("at <time-of-day>morning", -5.0238805208462765),
-                                    ("until <time-of-day>in|during the <part-of-day>",
-                                     -5.0238805208462765)],
-                               n = 128},
-                   koData =
-                     ClassData{prior = -2.1972245773362196, unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -3.283414346005772),
-                                    ("year (latent)on <date>", -3.6888794541139363),
-                                    ("<time-of-day>  o'clockafter lunch", -3.6888794541139363),
-                                    ("intersectevening", -2.995732273553991),
-                                    ("monthhour", -3.6888794541139363),
-                                    ("time-of-day (latent)on <date>", -2.772588722239781),
-                                    ("hourhour", -1.742969305058623),
-                                    ("<time-of-day>  o'clockafternoon", -3.6888794541139363),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -3.6888794541139363),
-                                    ("named-monthmorning", -3.6888794541139363),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.772588722239781)],
-                               n = 16}}),
-       ("today",
-        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}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2113090936672069, unseen = -4.382026634673881,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -2.0668627594729756),
-                                    ("half <integer> (german style hour-of-day)",
-                                     -3.676300671907076),
-                                    ("about <time-of-day>", -2.760009940032921),
-                                    ("time-of-day (latent)", -1.7303905228517629),
-                                    ("relative minutes after|past <integer> (hour-of-day)",
-                                     -3.676300671907076),
-                                    ("hh:mm", -2.760009940032921),
-                                    ("quarter after|past <integer> (hour-of-day)",
-                                     -3.676300671907076),
-                                    ("hour", -1.0736109864626924), ("minute", -2.172223275130802),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -3.676300671907076)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -1.6582280766035324, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.5040773967762742),
-                                    ("<time-of-day> am|pm", -1.9095425048844386),
-                                    ("hour", -1.349926716949016), ("minute", -2.1972245773362196)],
-                               n = 8}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = -7.410797215372185e-2,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.268683541318364), ("day", -0.7282385003712154),
-                                    ("named-day", -0.8823891801984737)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -2.639057329615259, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.916290731874155), ("named-day", -0.916290731874155)],
-                               n = 1}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.24256163717131135,
-                               unseen = -4.787491742782046,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("absorption of , after named day", -3.6805112044434196),
-                                    ("intersect", -1.834684513945089),
-                                    ("after lunch", -2.833213344056216),
-                                    ("day", -1.5210269550900473), ("afternoon", -2.833213344056216),
-                                    ("named-day", -2.833213344056216),
-                                    ("intersect by ','", -2.833213344056216),
-                                    ("intersect by 'of', 'from', 's", -3.392829131991639),
-                                    ("<day-of-month> (ordinal)", -4.085976312551584),
-                                    ("hour", -1.8887517352153647), ("evening", -4.085976312551584),
-                                    ("<datetime> - <datetime> (interval)", -4.085976312551584),
-                                    ("minute", -2.4765384001174837),
-                                    ("morning", -4.085976312551584)],
-                               n = 51},
-                   koData =
-                     ClassData{prior = -1.5353299402803784, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.7272209480904839),
-                                    ("after lunch", -3.1135153092103742),
-                                    ("<day-of-month>(ordinal) <named-month>", -3.1135153092103742),
-                                    ("tomorrow", -3.1135153092103742), ("day", -2.1972245773362196),
-                                    ("hh:mm", -2.70805020110221),
-                                    ("intersect by 'of', 'from', 's", -3.1135153092103742),
-                                    ("<day-of-month> (ordinal)", -3.1135153092103742),
-                                    ("hour", -3.1135153092103742), ("minute", -1.5040773967762742)],
-                               n = 14}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -2.3025850929940455, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 1}}),
-       ("between <datetime> and <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 1}}),
-       ("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}}),
-       ("<time-of-day>  o'clock",
-        Classifier{okData =
-                     ClassData{prior = -4.580953603129422e-2,
-                               unseen = -4.9344739331306915,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("exactly <time-of-day>", -4.23410650459726),
-                                    ("at <time-of-day>", -2.624668592163159),
-                                    ("half <integer> (german style hour-of-day)",
-                                     -4.23410650459726),
-                                    ("about <time-of-day>", -2.847812143477369),
-                                    ("time-of-day (latent)", -1.3437347467010947),
-                                    ("quarter after|past <integer> (hour-of-day)",
-                                     -4.23410650459726),
-                                    ("until <time-of-day>", -3.1354942159291497),
-                                    ("hour", -0.7841189587656721), ("minute", -3.828641396489095),
-                                    ("after <time-of-day>", -3.1354942159291497)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -3.1060803307228566, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.6739764335716716),
-                                    ("hour", -1.3862943611198906),
-                                    ("after <time-of-day>", -2.0794415416798357)],
-                               n = 3}}),
-       ("hour (grain)",
-        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}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..19th)quarter (grain)", -0.916290731874155),
-                                    ("quarter", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.916290731874155),
-                                    ("quarter", -0.916290731874155)],
-                               n = 1}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.26452876747706405, unseen = -6.90975328164481,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect by ','named-month", -4.4238481295272205),
-                                    ("hourday", -4.962844630259907),
-                                    ("<datetime> - <datetime> (interval)year", -4.962844630259907),
-                                    ("dayhour", -2.5520459526256287),
-                                    ("daymonth", -3.147554663621658),
-                                    ("<day-of-month>(ordinal) <named-month> year<time-of-day>  o'clock",
-                                     -6.215607598755275),
-                                    ("monthyear", -4.51085950651685),
-                                    ("yearhour", -6.215607598755275),
-                                    ("intersect<time-of-day>  o'clock", -4.075541435259004),
-                                    ("christmasyear", -6.215607598755275),
-                                    ("after lunchat <time-of-day>", -6.215607598755275),
-                                    ("absorption of , after named daymm/dd/yyyy",
-                                     -6.215607598755275),
-                                    ("named-daylast <cycle>", -6.215607598755275),
-                                    ("intersect by 'of', 'from', 'syear", -5.810142490647111),
-                                    ("<time-of-day> am|pmintersect", -5.116995310087166),
-                                    ("intersect<time> <part-of-day>", -4.13616605707544),
-                                    ("the <day-of-month> (ordinal)named-month", -6.215607598755275),
-                                    ("<time-of-day>  o'clockafter lunch", -5.52246041819533),
-                                    ("<time> <part-of-day><time-of-day>  o'clock",
-                                     -6.215607598755275),
-                                    ("today<time-of-day>  o'clock", -6.215607598755275),
-                                    ("<time-of-day>  o'clockon <date>", -5.810142490647111),
-                                    ("<time-of-day> am|pmintersect by ','", -5.52246041819533),
-                                    ("intersect by ','year", -5.116995310087166),
-                                    ("on <date><time-of-day>  o'clock", -6.215607598755275),
-                                    ("exactly <time-of-day>tomorrow", -5.810142490647111),
-                                    ("mm/dd<time-of-day>  o'clock", -6.215607598755275),
-                                    ("monthhour", -5.810142490647111),
-                                    ("on <date>between <datetime> and <datetime> (interval)",
-                                     -6.215607598755275),
-                                    ("last <day-of-week> of <time>year", -6.215607598755275),
-                                    ("hourmonth", -5.810142490647111),
-                                    ("todayat <time-of-day>", -5.52246041819533),
-                                    ("mm/ddabout <time-of-day>", -5.810142490647111),
-                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -6.215607598755275),
-                                    ("on <date>at <time-of-day>", -5.810142490647111),
-                                    ("named-dayhh:mm", -6.215607598755275),
-                                    ("dayday", -3.0375537684073297),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.810142490647111),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -6.215607598755275),
-                                    ("about <time-of-day>on <date>", -6.215607598755275),
-                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
-                                     -5.810142490647111),
-                                    ("<day-of-month> (ordinal)intersect", -5.116995310087166),
-                                    ("hourhour", -3.68987895444702),
-                                    ("<part-of-day> of <time>named-month", -5.810142490647111),
-                                    ("hh:mmintersect by ','", -4.962844630259907),
-                                    ("intersectnamed-month", -3.3823942546990593),
-                                    ("dayyear", -3.297836866670996),
-                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
-                                     -5.116995310087166),
-                                    ("tomorrow<time-of-day>  o'clock", -6.215607598755275),
-                                    ("<time-of-day>  o'clocktomorrow", -5.52246041819533),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.810142490647111),
-                                    ("half <integer> (german style hour-of-day)after lunch",
-                                     -6.215607598755275),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -4.962844630259907),
-                                    ("hourminute", -5.52246041819533),
-                                    ("on <date><day-of-month>(ordinal) <named-month>",
-                                     -5.810142490647111),
-                                    ("minutemonth", -3.5414589493287467),
-                                    ("minutehour", -3.96431580014878),
-                                    ("named-day<time> timezone", -6.215607598755275),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.29931686688112),
-                                    ("named-monthyear", -4.51085950651685),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
-                                     -5.810142490647111),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -5.116995310087166),
-                                    ("named-day<time-of-day> - <time-of-day> (interval)",
-                                     -6.215607598755275),
-                                    ("<day-of-month>(ordinal) <named-month> year<time> <part-of-day>",
-                                     -6.215607598755275),
-                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
-                                     -6.215607598755275),
-                                    ("named-day<datetime> - <datetime> (interval)",
-                                     -6.215607598755275),
-                                    ("on <date>named-month", -5.29931686688112),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -4.829313237635384),
-                                    ("this <part-of-day><time-of-day>  o'clock",
-                                     -6.215607598755275),
-                                    ("<day-of-month>(ordinal) <named-month>intersect",
-                                     -6.215607598755275),
-                                    ("hh:mmintersect", -3.7732605633860707),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -5.810142490647111),
-                                    ("named-daynext <cycle>", -6.215607598755275),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.52246041819533),
-                                    ("<day-of-month> (ordinal)named-day", -5.810142490647111),
-                                    ("intersect by ','intersect", -4.962844630259907),
-                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
-                                     -5.810142490647111),
-                                    ("from <datetime> - <datetime> (interval)year",
-                                     -5.52246041819533),
-                                    ("at <time-of-day>intersect", -4.4238481295272205),
-                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.810142490647111),
-                                    ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
-                                     -6.215607598755275),
-                                    ("absorption of , after named day<day-of-month> (ordinal)",
-                                     -4.962844630259907),
-                                    ("dayminute", -4.018383021419056),
-                                    ("on <date>from <datetime> - <datetime> (interval)",
-                                     -6.215607598755275),
-                                    ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
-                                     -6.215607598755275),
-                                    ("intersectyear", -4.4238481295272205),
-                                    ("on <date>intersect", -5.810142490647111),
-                                    ("on <date><day-of-month> (ordinal)", -5.810142490647111),
-                                    ("<ordinal> <cycle> of <time>year", -6.215607598755275),
-                                    ("minuteday", -2.235925944853314),
-                                    ("absorption of , after named dayintersect",
-                                     -3.817712325956905),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -6.215607598755275),
-                                    ("<datetime> - <datetime> (interval)named-month",
-                                     -5.810142490647111),
-                                    ("year<time-of-day>  o'clock", -6.215607598755275),
-                                    ("at <time-of-day>intersect by ','", -5.52246041819533),
-                                    ("named-dayat <time-of-day>", -5.810142490647111),
-                                    ("hh:mmabsorption of , after named day", -5.810142490647111),
-                                    ("<time-of-day> am|pmnamed-day", -6.215607598755275),
-                                    ("intersect by ','<time> <part-of-day>", -5.29931686688112),
-                                    ("hh:mmon <date>", -3.7732605633860707),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -6.215607598755275),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -6.215607598755275),
-                                    ("until <time-of-day>after lunch", -6.215607598755275),
-                                    ("mm/ddyear", -5.810142490647111),
-                                    ("intersect by ','<time-of-day>  o'clock", -5.29931686688112),
-                                    ("intersect<day-of-month> (ordinal)", -4.829313237635384),
-                                    ("absorption of , after named daymm/dd", -6.215607598755275),
-                                    ("named-day<time-of-day>  o'clock", -6.215607598755275),
-                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
-                                     -5.52246041819533),
-                                    ("at <time-of-day>on <date>", -4.343805421853684),
-                                    ("intersectintersect", -4.075541435259004),
-                                    ("dayweek", -5.116995310087166),
-                                    ("absorption of , after named daythe <day-of-month> (ordinal)",
-                                     -6.215607598755275),
-                                    ("weekyear", -5.810142490647111),
-                                    ("hh:mmin|during the <part-of-day>", -5.29931686688112),
-                                    ("intersect by 'of', 'from', 'snamed-month",
-                                     -6.215607598755275),
-                                    ("named-monthintersect", -6.215607598755275),
-                                    ("<day-of-month> (ordinal)named-month", -4.343805421853684),
-                                    ("tomorrowat <time-of-day>", -5.810142490647111),
-                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
-                                     -6.215607598755275),
-                                    ("named-daythis <cycle>", -5.52246041819533),
-                                    ("at <time-of-day>tomorrow", -6.215607598755275),
-                                    ("about <time-of-day>in|during the <part-of-day>",
-                                     -5.810142490647111),
-                                    ("half <integer> (german style hour-of-day)on <date>",
-                                     -6.215607598755275),
-                                    ("this <part-of-day>at <time-of-day>", -5.810142490647111),
-                                    ("after lunch<hour-of-day> <integer> (as relative minutes)",
-                                     -5.810142490647111),
-                                    ("last <cycle> of <time>year", -5.810142490647111),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -6.215607598755275),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -6.215607598755275)],
-                               n = 426},
-                   koData =
-                     ClassData{prior = -1.4591557093847622,
-                               unseen = -6.0112671744041615,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect by ','named-month", -4.622518824322705),
-                                    ("named-day<part-of-day> of <time>", -5.31566600488265),
-                                    ("absorption of , after named daythe <day-of-month> (non ordinal)",
-                                     -5.31566600488265),
-                                    ("<datetime> - <datetime> (interval)year", -5.31566600488265),
-                                    ("dayhour", -4.622518824322705),
-                                    ("daymonth", -3.4438638279810583),
-                                    ("monthday", -4.9102008967744855),
-                                    ("monthyear", -5.31566600488265),
-                                    ("yearhour", -5.31566600488265),
-                                    ("after lunchat <time-of-day>", -4.9102008967744855),
-                                    ("mm/dduntil <time-of-day>", -4.9102008967744855),
-                                    ("until <time-of-day>year", -4.9102008967744855),
-                                    ("intersect by 'of', 'from', 'syear", -4.622518824322705),
-                                    ("<time-of-day> am|pmintersect", -3.6109179126442243),
-                                    ("intersect<time> <part-of-day>", -5.31566600488265),
-                                    ("<time-of-day>  o'clockafter lunch", -5.31566600488265),
-                                    ("after lunch<time-of-day>  o'clock", -5.31566600488265),
-                                    ("at <time-of-day>named-day", -5.31566600488265),
-                                    ("absorption of , after named dayhh:mm", -5.31566600488265),
-                                    ("<time-of-day> am|pmintersect by ','", -4.062903036387282),
-                                    ("<time-of-day>  o'clock<time> <part-of-day>",
-                                     -4.399375273008495),
-                                    ("mm/ddhh:mm", -4.399375273008495),
-                                    ("monthhour", -5.31566600488265),
-                                    ("on <date>between <datetime> and <datetime> (interval)",
-                                     -5.31566600488265),
-                                    ("todayat <time-of-day>", -5.31566600488265),
-                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -5.31566600488265),
-                                    ("named-dayhh:mm", -5.31566600488265),
-                                    ("dayday", -3.9293716437627593),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -4.9102008967744855),
-                                    ("hourhour", -3.8115886081063755),
-                                    ("intersectnamed-month", -3.7062280924485496),
-                                    ("dayyear", -3.236224463202814),
-                                    ("minutemonth", -3.369755855827336),
-                                    ("named-monthyear", -5.31566600488265),
-                                    ("named-day<time-of-day> - <time-of-day> (interval)",
-                                     -5.31566600488265),
-                                    ("on <date>named-month", -5.31566600488265),
-                                    ("absorption of , after named daynamed-month",
-                                     -4.21705371621454),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -4.622518824322705),
-                                    ("named-dayafter <time-of-day>", -4.9102008967744855),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -4.9102008967744855),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -5.31566600488265),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.622518824322705),
-                                    ("<day-of-month> (ordinal)named-day", -4.622518824322705),
-                                    ("<day-of-month> (ordinal)hh:mm", -4.399375273008495),
-                                    ("at <time-of-day>intersect", -4.21705371621454),
-                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -4.9102008967744855),
-                                    ("dayminute", -2.676608675267391),
-                                    ("on <date>from <datetime> - <datetime> (interval)",
-                                     -5.31566600488265),
-                                    ("minuteday", -2.3199337313286588),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.31566600488265),
-                                    ("at <time-of-day>intersect by ','", -4.622518824322705),
-                                    ("<time-of-day> am|pmnamed-day", -4.9102008967744855),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -5.31566600488265),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -5.31566600488265),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -4.9102008967744855),
-                                    ("year<time> <part-of-day>", -5.31566600488265),
-                                    ("mm/ddyear", -3.8115886081063755),
-                                    ("intersect<day-of-month> (ordinal)", -4.622518824322705),
-                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
-                                     -4.9102008967744855),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -4.9102008967744855),
-                                    ("intersectintersect", -4.622518824322705),
-                                    ("<day-of-month> (ordinal)named-month", -4.622518824322705),
-                                    ("until <time-of-day>named-month", -5.31566600488265),
-                                    ("after <time-of-day>year", -5.31566600488265),
-                                    ("on <date>after <time-of-day>", -5.31566600488265),
-                                    ("tomorrownoon", -5.31566600488265)],
-                               n = 129}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7047480922384253),
-                                    ("ordinals (first..19th)week (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("ordinals (first..19th)day (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("ordinals (first..19th)week (grain)intersect",
-                                     -1.7047480922384253),
-                                    ("weekmonth", -1.2992829841302609)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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}}),
-       ("year (grain)",
-        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}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.159484249353372),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.5649493574615367),
-                                    ("hh:mmhh:mm", -2.159484249353372),
-                                    ("dayday", -1.8718021769015913),
-                                    ("hourhour", -2.5649493574615367),
-                                    ("mm/ddmm/dd", -1.8718021769015913)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.3513752571634776),
-                                    ("mm/ddmm/dd/yyyy", -2.3513752571634776),
-                                    ("hh:mmtime-of-day (latent)", -2.639057329615259),
-                                    ("mm/ddhh:mm", -2.3513752571634776),
-                                    ("dayday", -1.791759469228055),
-                                    ("minutehour", -2.639057329615259),
-                                    ("mm/ddintersect", -2.3513752571634776),
-                                    ("dayminute", -2.3513752571634776),
-                                    ("mm/ddtime-of-day (latent)", -2.3513752571634776)],
-                               n = 14}}),
-       ("after tomorrow",
-        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,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003),
-                                    ("month (grain)", -2.3025850929940455),
-                                    ("year (grain)", -2.3025850929940455),
-                                    ("week (grain)", -1.6094379124341003),
-                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
-                                    ("month", -2.3025850929940455),
-                                    ("quarter (grain)", -2.3025850929940455)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003),
-                                    ("week (grain)", -1.6094379124341003)],
-                               n = 1}}),
-       ("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.5596157879354228, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.252762968495368),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -1.9459101490553135),
-                                    ("hh:mmhh:mm", -1.252762968495368),
-                                    ("hourhour", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 3}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("mm/dd/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("couple",
-        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}}),
-       ("yesterday",
-        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}}),
-       ("<ordinal> quarter <year>",
-        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}}),
-       ("after lunch",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter to|till|before <integer> (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}}),
-       ("Allerheiligen",
-        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> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7884573603642702),
-                                    ("ordinals (first..19th)named-dayintersect",
-                                     -1.0116009116784799),
-                                    ("ordinals (first..19th)named-daynamed-month",
-                                     -1.7047480922384253)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("ordinals (first..19th)named-daynamed-month",
-                                     -0.8109302162163288)],
-                               n = 3}}),
-       ("the <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.891820298110627,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 47},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (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}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -0.9444616088408514),
-                                    ("morning<day-of-month>(ordinal) <named-month>",
-                                     -1.791759469228055),
-                                    ("morningintersect", -1.791759469228055),
-                                    ("morning<day-of-month> (ordinal)", -1.791759469228055)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("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}}),
-       ("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}}),
-       ("half <integer> (german style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -1.7047480922384253),
-                                    ("time-of-day (latent)", -1.0116009116784799),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("evening", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)named-month", -0.8109302162163288),
-                                    ("month", -0.7308875085427924),
-                                    ("ordinals (first..19th)named-month", -2.6026896854443837)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)named-month", -0.8109302162163288),
-                                    ("month", -0.8109302162163288)],
-                               n = 3}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 18}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -6.0624621816434854e-2,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("after lunch", -1.6650077635889111),
-                                    ("afternoon", -1.5314763709643884),
-                                    ("hour", -0.7777045685880083), ("evening", -2.512305623976115),
-                                    ("morning", -2.917770732084279)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -2.833213344056216, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("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,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     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 = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.3862943611198906),
-                                    ("day", -1.3862943611198906),
-                                    ("named-day", -1.3862943611198906),
-                                    ("month", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        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 <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 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.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2039728043259361),
-                                    ("year (grain)", -2.3025850929940455),
-                                    ("week (grain)", -1.2039728043259361),
-                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
-                                    ("quarter (grain)", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        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}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -1.3862943611198906),
-                                    ("time-of-day (latent)", -1.3862943611198906),
-                                    ("hour", -0.7576857016975165)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.3862943611198906),
-                                    ("<time-of-day> am|pm", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262)],
-                               n = 2}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.7686547330680905, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.11778303565638351),
-                                    ("integer (0..19)", -2.379546134130174)],
-                               n = 51},
-                   koData =
-                     ClassData{prior = -0.6229429218866968, unseen = -4.143134726391533,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.4895482253187058),
-                                    ("integer (0..19)", -1.0826119473216687),
-                                    ("couple", -3.028522096376982)],
-                               n = 59}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -8.338160893905101e-2,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -2.5257286443082556,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.0986122886681098),
-                                    ("daymonth", -0.8109302162163288),
-                                    ("named-dayintersect", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.8850381883700507, unseen = -4.330733340286331,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.2380465718564744),
-                                    ("integer (0..19)year (grain)", -3.2188758248682006),
-                                    ("integer (numeric)day (grain)", -2.70805020110221),
-                                    ("couplehour (grain)", -3.624340932976365),
-                                    ("integer (0..19)hour (grain)", -3.2188758248682006),
-                                    ("second", -3.624340932976365),
-                                    ("integer (numeric)year (grain)", -3.624340932976365),
-                                    ("day", -2.70805020110221), ("year", -2.9311937524164198),
-                                    ("integer (numeric)week (grain)", -2.9311937524164198),
-                                    ("integer (0..19)month (grain)", -3.624340932976365),
-                                    ("integer (0..19)second (grain)", -3.624340932976365),
-                                    ("hour", -2.70805020110221), ("month", -3.624340932976365),
-                                    ("integer (numeric)minute (grain)", -2.5257286443082556),
-                                    ("integer (0..19)minute (grain)", -3.624340932976365),
-                                    ("minute", -2.371577964480997),
-                                    ("integer (numeric)hour (grain)", -3.624340932976365),
-                                    ("integer (0..19)week (grain)", -2.70805020110221)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -0.5322168137473082, unseen = -4.584967478670572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.62880082944807),
-                                    ("integer (0..19)year (grain)", -2.9652730660692823),
-                                    ("integer (numeric)day (grain)", -3.4760986898352733),
-                                    ("integer (0..19)hour (grain)", -3.8815637979434374),
-                                    ("second", -2.9652730660692823),
-                                    ("integer (numeric)second (grain)", -3.4760986898352733),
-                                    ("integer (numeric)year (grain)", -3.4760986898352733),
-                                    ("day", -2.3774864011671633), ("year", -2.62880082944807),
-                                    ("integer (numeric)week (grain)", -3.188416617383492),
-                                    ("integer (0..19)month (grain)", -2.9652730660692823),
-                                    ("integer (0..19)second (grain)", -3.4760986898352733),
-                                    ("hour", -3.188416617383492), ("month", -2.62880082944807),
-                                    ("integer (numeric)minute (grain)", -3.4760986898352733),
-                                    ("integer (0..19)minute (grain)", -3.4760986898352733),
-                                    ("integer (numeric)month (grain)", -3.4760986898352733),
-                                    ("minute", -2.9652730660692823),
-                                    ("coupleday (grain)", -3.4760986898352733),
-                                    ("integer (numeric)hour (grain)", -3.4760986898352733),
-                                    ("integer (0..19)day (grain)", -2.9652730660692823),
-                                    ("integer (0..19)week (grain)", -3.188416617383492)],
-                               n = 37}}),
-       ("ordinals (first..19th)",
-        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}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -1.845826690498331, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -2.0794415416798357),
-                                    ("hh:mm", -2.0794415416798357),
-                                    ("until <time-of-day>", -2.0794415416798357),
-                                    ("hour", -1.6739764335716716), ("minute", -2.0794415416798357)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.17185025692665928,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.3513752571634776),
-                                    ("<time-of-day>  o'clock", -2.3513752571634776),
-                                    ("half <integer> (german style hour-of-day)",
-                                     -3.044522437723423),
-                                    ("about <time-of-day>", -3.044522437723423),
-                                    ("time-of-day (latent)", -2.128231705849268),
-                                    ("hh:mm", -2.3513752571634776), ("hour", -1.4350845252893227),
-                                    ("minute", -1.6582280766035324),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -3.044522437723423)],
-                               n = 16}}),
-       ("<duration> after <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>christmas", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>christmas", -1.252762968495368),
-                                    ("yearday", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8472978603872037),
-                                    ("integer (numeric)time-of-day (latent)", -1.252762968495368),
-                                    ("integer (20..90)time-of-day (latent)", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.9924301646902063),
-                                    ("hour (grain)", -2.3978952727983707),
-                                    ("year (grain)", -2.3978952727983707),
-                                    ("second", -2.3978952727983707),
-                                    ("week (grain)", -1.9924301646902063),
-                                    ("minute (grain)", -2.3978952727983707),
-                                    ("year", -2.3978952727983707),
-                                    ("second (grain)", -2.3978952727983707),
-                                    ("hour", -2.3978952727983707), ("minute", -2.3978952727983707)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd.(mm.)? - dd.mm.(yy[yy]?)? (interval)",
-        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}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -0.6190392084062235,
-                               unseen = -3.6109179126442243,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 35},
-                   koData =
-                     ClassData{prior = -0.7731898882334817,
-                               unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
-       ("quarter after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -1.5040773967762742),
-                                    ("time-of-day (latent)", -1.0986122886681098),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.0943445622221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 58},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -0.6931471805599453),
-                                    ("minutehour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by ','",
-        Classifier{okData =
-                     ClassData{prior = -0.2531958963806117, unseen = -4.962844630259907,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.7586024802650413),
-                                    ("named-day<day-of-month> (ordinal)", -3.3463891451671604),
-                                    ("dayday", -1.2922654114716141),
-                                    ("dayyear", -4.2626798770413155),
-                                    ("on <date><day-of-month>(ordinal) <named-month>",
-                                     -3.857214768933151),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -3.164067588373206),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -3.3463891451671604),
-                                    ("named-day<day-of-month>(ordinal) <named-month> year",
-                                     -3.857214768933151),
-                                    ("named-dayintersect", -1.9113046198778378),
-                                    ("on <date>intersect", -3.857214768933151),
-                                    ("on <date><day-of-month> (ordinal)", -3.857214768933151),
-                                    ("named-daymm/dd/yyyy", -3.857214768933151),
-                                    ("minuteday", -2.390877700139724),
-                                    ("named-daymm/dd", -3.857214768933151),
-                                    ("intersect<day-of-month> (ordinal)", -3.3463891451671604),
-                                    ("intersectintersect", -3.3463891451671604),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -3.3463891451671604),
-                                    ("named-daythe <day-of-month> (ordinal)", -4.2626798770413155),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -4.2626798770413155)],
-                               n = 59},
-                   koData =
-                     ClassData{prior = -1.497519996230115, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -2.268683541318364),
-                                    ("daymonth", -2.268683541318364),
-                                    ("named-dayhh:mm", -2.9618307218783095),
-                                    ("dayday", -3.367295829986474),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -2.6741486494265287),
-                                    ("dayminute", -2.9618307218783095),
-                                    ("minuteday", -1.7578579175523736),
-                                    ("intersect<day-of-month> (ordinal)", -2.6741486494265287),
-                                    ("intersectintersect", -2.6741486494265287),
-                                    ("named-daythe <day-of-month> (non ordinal)",
-                                     -3.367295829986474)],
-                               n = 17}}),
-       ("second (grain)",
-        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}}),
-       ("intersect by 'of', 'from', 's",
-        Classifier{okData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -4.143134726391533,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -3.028522096376982),
-                                    ("daymonth", -2.181224235989778),
-                                    ("named-daylast <cycle>", -3.4339872044851463),
-                                    ("on <date>hh:mm", -3.4339872044851463),
-                                    ("named-dayhh:mm", -3.028522096376982),
-                                    ("dayday", -2.517696472610991),
-                                    ("intersectnamed-month", -3.028522096376982),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -3.4339872044851463),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
-                                     -3.4339872044851463),
-                                    ("named-day<time-of-day> - <time-of-day> (interval)",
-                                     -3.028522096376982),
-                                    ("named-day<datetime> - <datetime> (interval)",
-                                     -3.028522096376982),
-                                    ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -3.4339872044851463),
-                                    ("on <date><datetime> - <datetime> (interval)",
-                                     -3.4339872044851463),
-                                    ("named-daynext <cycle>", -3.4339872044851463),
-                                    ("named-dayintersect", -3.4339872044851463),
-                                    ("absorption of , after named day<day-of-month> (ordinal)",
-                                     -3.4339872044851463),
-                                    ("dayminute", -1.824549292051046),
-                                    ("absorption of , after named dayintersect",
-                                     -3.4339872044851463),
-                                    ("intersectintersect", -3.4339872044851463),
-                                    ("dayweek", -3.028522096376982)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -2.174751721484161),
-                                    ("daymonth", -1.4816045409242156),
-                                    ("intersectnamed-month", -2.6855773452501515),
-                                    ("named-day<time-of-day> - <time-of-day> (interval)",
-                                     -2.6855773452501515),
-                                    ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -3.0910424533583156),
-                                    ("named-dayintersect", -2.3978952727983707),
-                                    ("dayminute", -2.3978952727983707)],
-                               n = 12}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.4816045409242156), ("day", -1.9924301646902063),
-                                    ("year", -2.3978952727983707),
-                                    ("<integer> <unit-of-duration>", -1.0116009116784799),
-                                    ("a <unit-of-duration>", -2.3978952727983707),
-                                    ("month", -2.3978952727983707)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9808292530117262),
-                                    ("named-day", -0.9808292530117262)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.7672551527136672),
-                                    ("hour", -0.7672551527136672)],
-                               n = 12}}),
-       ("EOM|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}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.5520685823000397,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..19th)", -1.6582280766035324),
-                                    ("ordinal (digits)", -0.2113090936672069)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -0.8574502318512216, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..19th)", -0.8266785731844679),
-                                    ("ordinal (digits)", -0.5753641449035618)],
-                               n = 14}}),
-       ("noon",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907, unseen = -4.0943445622221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -2.1316272948504063),
-                                    ("<time-of-day>  o'clock", -2.2857779746776643),
-                                    ("intersect", -3.3843902633457743),
-                                    ("time-of-day (latent)", -2.1316272948504063),
-                                    ("<time-of-day> am|pm", -3.3843902633457743),
-                                    ("EOM|End of month", -3.3843902633457743),
-                                    ("hour", -1.0330150061822965), ("month", -3.3843902633457743),
-                                    ("midnight|EOD|end of day", -3.3843902633457743)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.70805020110221),
-                                    ("intersect", -2.4203681286504293),
-                                    ("mm/dd/yyyy", -2.70805020110221),
-                                    ("<day-of-month>(ordinal) <named-month>", -3.1135153092103742),
-                                    ("day", -1.4087672169719492), ("hh:mm", -2.1972245773362196),
-                                    ("<day-of-month> (ordinal)", -3.1135153092103742),
-                                    ("<day-of-month> (non ordinal) <named-month>",
-                                     -3.1135153092103742),
-                                    ("minute", -2.1972245773362196)],
-                               n = 14}}),
-       ("<integer> and an half hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (0..19)", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Nikolaus",
-        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}}),
-       ("evening",
-        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}}),
-       ("midnight|EOD|end of 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-of-day> until",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.466337068793427, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -2.1972245773362196),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.262364264467491, unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.7841189587656721),
-                                    ("hour", -0.7841189587656721)],
-                               n = 20}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5040773967762742),
-                                    ("month (grain)", -2.1972245773362196),
-                                    ("year (grain)", -2.1972245773362196),
-                                    ("week (grain)", -1.5040773967762742),
-                                    ("year", -2.1972245773362196), ("month", -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("week (grain)", -1.791759469228055),
-                                    ("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,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   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,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.740840023925201),
-                                    ("integer (0..19)year (grain)", -3.028522096376982),
-                                    ("integer (numeric)day (grain)", -3.4339872044851463),
-                                    ("integer (0..19)hour (grain)", -3.4339872044851463),
-                                    ("second", -3.028522096376982),
-                                    ("integer (numeric)second (grain)", -3.4339872044851463),
-                                    ("integer (numeric)year (grain)", -3.4339872044851463),
-                                    ("day", -2.3353749158170367), ("year", -2.740840023925201),
-                                    ("integer (numeric)week (grain)", -3.4339872044851463),
-                                    ("integer (0..19)month (grain)", -3.028522096376982),
-                                    ("integer (0..19)second (grain)", -3.4339872044851463),
-                                    ("hour", -3.028522096376982), ("month", -2.740840023925201),
-                                    ("integer (numeric)minute (grain)", -3.4339872044851463),
-                                    ("integer (0..19)minute (grain)", -3.4339872044851463),
-                                    ("integer (numeric)month (grain)", -3.4339872044851463),
-                                    ("minute", -3.028522096376982),
-                                    ("coupleday (grain)", -3.028522096376982),
-                                    ("integer (numeric)hour (grain)", -3.4339872044851463),
-                                    ("integer (0..19)day (grain)", -3.028522096376982),
-                                    ("integer (0..19)week (grain)", -3.028522096376982)],
-                               n = 20},
-                   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,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.0986122886681098),
-                                    ("hh:mm", -1.791759469228055), ("hour", -1.0986122886681098),
-                                    ("minute", -1.791759469228055)],
-                               n = 4}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6741486494265287),
-                                    ("number.number hours", -3.367295829986474),
-                                    ("second", -2.9618307218783095), ("day", -2.9618307218783095),
-                                    ("half an hour", -3.367295829986474),
-                                    ("year", -3.367295829986474),
-                                    ("<integer> <unit-of-duration>", -1.2878542883066382),
-                                    ("a <unit-of-duration>", -2.451005098112319),
-                                    ("<integer> and an half hours", -3.367295829986474),
-                                    ("hour", -2.268683541318364), ("minute", -1.6625477377480489),
-                                    ("about <duration>", -3.367295829986474)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.9694005571881036, unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.4657359027997265),
-                                    ("on <date>hh:mm", -3.4657359027997265),
-                                    ("minuteminute", -1.6739764335716716),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -3.0602707946915624),
-                                    ("hh:mmhh:mm", -2.2129729343043585),
-                                    ("dayday", -1.6739764335716716),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.0602707946915624),
-                                    ("intersect by 'of', 'from', 'shh:mm", -2.772588722239781),
-                                    ("mm/ddmm/dd", -2.0794415416798357)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -0.4769240720903093, unseen = -4.532599493153256,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)<day-of-month>(ordinal) <named-month>",
-                                     -3.4231762883809305),
-                                    ("daymonth", -3.4231762883809305),
-                                    ("mm/ddmm/dd/yyyy", -2.575878427993727),
-                                    ("<day-of-month> (ordinal)mm/dd", -2.91235066461494),
-                                    ("mm/ddhh:mm", -2.4423470353692043),
-                                    ("dayday", -1.3437347467010947),
-                                    ("<day-of-month> (ordinal)intersect", -3.1354942159291497),
-                                    ("<day-of-month> (ordinal)hh:mm", -2.91235066461494),
-                                    ("mm/ddintersect", -2.575878427993727),
-                                    ("dayminute", -2.03688192726104),
-                                    ("<day-of-month> (ordinal)mm/dd/yyyy", -3.4231762883809305),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -3.4231762883809305)],
-                               n = 36}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.8266785731844679, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.916290731874155),
-                                    ("hh:mmhh:mm", -0.916290731874155)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -0.5753641449035618,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.2321436812926323),
-                                    ("hourminute", -1.791759469228055),
-                                    ("minutehour", -1.2321436812926323),
-                                    ("time-of-day (latent)hh:mm", -1.791759469228055)],
-                               n = 9}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.5257286443082556),
-                                    ("integer (0..19)year (grain)", -2.8134107167600364),
-                                    ("integer (numeric)day (grain)", -3.2188758248682006),
-                                    ("second", -2.8134107167600364),
-                                    ("integer (numeric)second (grain)", -3.2188758248682006),
-                                    ("integer (numeric)year (grain)", -3.2188758248682006),
-                                    ("day", -2.5257286443082556), ("year", -2.5257286443082556),
-                                    ("integer (numeric)week (grain)", -2.8134107167600364),
-                                    ("integer (0..19)month (grain)", -2.8134107167600364),
-                                    ("integer (0..19)second (grain)", -3.2188758248682006),
-                                    ("month", -2.5257286443082556),
-                                    ("integer (numeric)minute (grain)", -3.2188758248682006),
-                                    ("integer (0..19)minute (grain)", -3.2188758248682006),
-                                    ("integer (numeric)month (grain)", -3.2188758248682006),
-                                    ("minute", -2.8134107167600364),
-                                    ("integer (0..19)day (grain)", -2.8134107167600364),
-                                    ("integer (0..19)week (grain)", -3.2188758248682006)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.9444389791664407,
-                               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..19th)named-dayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..19th)named-daychristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.12516314295400605,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -2.1400661634962708,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 4}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> after",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("quarter (grain)",
-        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 <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.540445040947149),
-                                    ("week (grain)named-month", -1.9459101490553135),
-                                    ("day (grain)intersect", -1.9459101490553135),
-                                    ("weekmonth", -1.540445040947149),
-                                    ("day (grain)named-month", -1.9459101490553135),
-                                    ("week (grain)intersect", -1.9459101490553135)],
-                               n = 4},
-                   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 = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("morning",
-        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}}),
-       ("week-end",
-        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}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -1.540445040947149),
-                                    ("time-of-day (latent)", -1.540445040947149),
-                                    ("hour", -0.9343092373768334)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day>  o'clock", -2.3025850929940455),
-                                    ("intersect", -2.3025850929940455),
-                                    ("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)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <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}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("at <time-of-day>integer (numeric)", -2.0149030205422647),
-                                    ("<time-of-day>  o'clockinteger (numeric)",
-                                     -1.0986122886681098)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (0..19)", -2.0149030205422647),
-                                    ("time-of-day (latent)integer (numeric)", -1.0986122886681098),
-                                    ("hour", -0.916290731874155)],
-                               n = 5}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("season", -1.466337068793427), ("day", -1.1786549963416462),
-                                    ("named-day", -1.8718021769015913),
-                                    ("hour", -1.8718021769015913),
-                                    ("week-end", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("within <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("before yesterday",
-        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}})]
diff --git a/Duckling/Ranking/Classifiers/DE_XX.hs b/Duckling/Ranking/Classifiers/DE_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/DE_XX.hs
@@ -0,0 +1,2063 @@
+-- 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.DE_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.3862943611198906),
+                                    ("hh:mm", -1.3862943611198906), ("hour", -1.3862943611198906),
+                                    ("minute", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.9179699933938751, unseen = -4.795790545596741,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 119},
+                   koData =
+                     ClassData{prior = -0.5097076806646496, unseen = -5.198497031265826,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 179}}),
+       ("exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.0986122886681098),
+                                    ("<time-of-day>  o'clock", -1.5040773967762742),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3},
+                   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,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("lunch",
+        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 (20..90)",
+        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}}),
+       ("Marz",
+        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}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -5.723585101952381,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clockmorning", -4.621699487939302),
+                                    ("until <time-of-day>afternoon", -5.0271645960474665),
+                                    ("dayhour", -3.322416503809041),
+                                    ("todayevening", -4.621699487939302),
+                                    ("half <integer> (german style hour-of-day)afternoon",
+                                     -5.0271645960474665),
+                                    ("<time-of-day>  o'clockafter lunch", -4.334017415487521),
+                                    ("intersect by ','evening", -3.5230871992711923),
+                                    ("<time-of-day>  o'clockon <date>", -3.9285523073793565),
+                                    ("intersectevening", -1.9591116609138493),
+                                    ("time-of-day (latent)on <date>", -4.334017415487521),
+                                    ("about <time-of-day>on <date>", -4.621699487939302),
+                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
+                                     -4.621699487939302),
+                                    ("hourhour", -1.1985231995583712),
+                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
+                                     -3.9285523073793565),
+                                    ("Donnerstagmorning", -5.0271645960474665),
+                                    ("<time-of-day>  o'clockafternoon", -4.334017415487521),
+                                    ("half <integer> (german style hour-of-day)after lunch",
+                                     -5.0271645960474665),
+                                    ("until <time-of-day>morning", -4.621699487939302),
+                                    ("minutehour", -2.3881072664322076),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -4.110873864173311),
+                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
+                                     -5.0271645960474665),
+                                    ("<time-of-day> am|pmmorning", -4.621699487939302),
+                                    ("tomorrowevening", -5.0271645960474665),
+                                    ("time-of-day (latent)morning", -5.0271645960474665),
+                                    ("hh:mmmorning", -5.0271645960474665),
+                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
+                                     -4.621699487939302),
+                                    ("until <time-of-day>on <date>", -5.0271645960474665),
+                                    ("<day-of-month>(ordinal) <named-month>morning",
+                                     -5.0271645960474665),
+                                    ("<time-of-day>  o'clockevening", -5.0271645960474665),
+                                    ("hh:mmon <date>", -4.110873864173311),
+                                    ("<hour-of-day> <integer> (as relative minutes)afternoon",
+                                     -5.0271645960474665),
+                                    ("tomorrowlunch", -4.621699487939302),
+                                    ("until <time-of-day>after lunch", -5.0271645960474665),
+                                    ("Montagmorning", -5.0271645960474665),
+                                    ("at <time-of-day>on <date>", -4.110873864173311),
+                                    ("yesterdayevening", -5.0271645960474665),
+                                    ("intersectmorning", -5.0271645960474665),
+                                    ("hh:mmin|during the <part-of-day>", -4.110873864173311),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -4.334017415487521),
+                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
+                                     -4.621699487939302),
+                                    ("about <time-of-day>in|during the <part-of-day>",
+                                     -4.621699487939302),
+                                    ("half <integer> (german style hour-of-day)on <date>",
+                                     -4.621699487939302),
+                                    ("at <time-of-day>morning", -5.0271645960474665),
+                                    ("until <time-of-day>in|during the <part-of-day>",
+                                     -5.0271645960474665)],
+                               n = 128},
+                   koData =
+                     ClassData{prior = -2.1972245773362196, unseen = -4.406719247264253,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -3.295836866004329),
+                                    ("year (latent)on <date>", -3.7013019741124937),
+                                    ("<time-of-day>  o'clockafter lunch", -3.7013019741124937),
+                                    ("intersectevening", -3.0081547935525483),
+                                    ("monthhour", -3.7013019741124937),
+                                    ("time-of-day (latent)on <date>", -2.7850112422383386),
+                                    ("hourhour", -1.7553918250571803),
+                                    ("Februarmorning", -3.7013019741124937),
+                                    ("<time-of-day>  o'clockafternoon", -3.7013019741124937),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -3.7013019741124937),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.7850112422383386)],
+                               n = 16}}),
+       ("today",
+        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}}),
+       ("mm/dd",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2113090936672069, unseen = -4.382026634673881,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -2.0668627594729756),
+                                    ("half <integer> (german style hour-of-day)",
+                                     -3.676300671907076),
+                                    ("about <time-of-day>", -2.760009940032921),
+                                    ("time-of-day (latent)", -1.7303905228517629),
+                                    ("relative minutes after|past <integer> (hour-of-day)",
+                                     -3.676300671907076),
+                                    ("hh:mm", -2.760009940032921),
+                                    ("quarter after|past <integer> (hour-of-day)",
+                                     -3.676300671907076),
+                                    ("hour", -1.0736109864626924), ("minute", -2.172223275130802),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -3.676300671907076)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -1.6582280766035324, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.5040773967762742),
+                                    ("<time-of-day> am|pm", -1.9095425048844386),
+                                    ("hour", -1.349926716949016), ("minute", -2.1972245773362196)],
+                               n = 8}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = -7.410797215372185e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -2.3978952727983707),
+                                    ("Freitag", -1.7047480922384253),
+                                    ("Sonntag", -2.803360380906535),
+                                    ("Montag", -2.1102132003465894), ("day", -0.8574502318512216),
+                                    ("Mittwoch", -2.803360380906535),
+                                    ("Samstag", -2.803360380906535)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -2.639057329615259, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Freitag", -1.5040773967762742), ("day", -1.5040773967762742)],
+                               n = 1}}),
+       ("September",
+        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}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.24256163717131135,
+                               unseen = -4.804021044733257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("absorption of , after named day", -3.6971782569286313),
+                                    ("Freitag", -4.102643365036796),
+                                    ("intersect", -1.8513515664303006),
+                                    ("after lunch", -2.849880396541428),
+                                    ("day", -1.537694007575259), ("afternoon", -2.849880396541428),
+                                    ("intersect by ','", -2.849880396541428),
+                                    ("intersect by 'of', 'from', 's", -3.4094961844768505),
+                                    ("Donnerstag", -3.4094961844768505),
+                                    ("<day-of-month> (ordinal)", -4.102643365036796),
+                                    ("hour", -1.9054187877005764), ("evening", -4.102643365036796),
+                                    ("<datetime> - <datetime> (interval)", -4.102643365036796),
+                                    ("minute", -2.4932054526026954),
+                                    ("Samstag", -3.6971782569286313),
+                                    ("morning", -4.102643365036796)],
+                               n = 51},
+                   koData =
+                     ClassData{prior = -1.5353299402803784, unseen = -3.871201010907891,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7707060600302227),
+                                    ("after lunch", -3.1570004211501135),
+                                    ("<day-of-month>(ordinal) <named-month>", -3.1570004211501135),
+                                    ("tomorrow", -3.1570004211501135), ("day", -2.2407096892759584),
+                                    ("hh:mm", -2.751535313041949),
+                                    ("intersect by 'of', 'from', 's", -3.1570004211501135),
+                                    ("<day-of-month> (ordinal)", -3.1570004211501135),
+                                    ("hour", -3.1570004211501135), ("minute", -1.547562508716013)],
+                               n = 14}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   koData =
+                     ClassData{prior = -2.3025850929940455, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("hh:mmhh:mm", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 1}}),
+       ("between <datetime> and <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("hh:mmhh:mm", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 1}}),
+       ("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}}),
+       ("<time-of-day>  o'clock",
+        Classifier{okData =
+                     ClassData{prior = -4.580953603129422e-2,
+                               unseen = -4.9344739331306915,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("exactly <time-of-day>", -4.23410650459726),
+                                    ("at <time-of-day>", -2.624668592163159),
+                                    ("half <integer> (german style hour-of-day)",
+                                     -4.23410650459726),
+                                    ("about <time-of-day>", -2.847812143477369),
+                                    ("time-of-day (latent)", -1.3437347467010947),
+                                    ("quarter after|past <integer> (hour-of-day)",
+                                     -4.23410650459726),
+                                    ("until <time-of-day>", -3.1354942159291497),
+                                    ("hour", -0.7841189587656721), ("minute", -3.828641396489095),
+                                    ("after <time-of-day>", -3.1354942159291497)],
+                               n = 64},
+                   koData =
+                     ClassData{prior = -3.1060803307228566, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.6739764335716716),
+                                    ("hour", -1.3862943611198906),
+                                    ("after <time-of-day>", -2.0794415416798357)],
+                               n = 3}}),
+       ("Freitag",
+        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}}),
+       ("Juli",
+        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}}),
+       ("hour (grain)",
+        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}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)quarter (grain)", -0.916290731874155),
+                                    ("quarter", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.916290731874155),
+                                    ("quarter", -0.916290731874155)],
+                               n = 1}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.26272534047791335,
+                               unseen = -6.927557906278317,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Samstag<time-of-day>  o'clock", -6.23342985266278),
+                                    ("hourday", -4.9806668841674115),
+                                    ("<datetime> - <datetime> (interval)year", -4.9806668841674115),
+                                    ("dayhour", -2.5698682065331333),
+                                    ("daymonth", -3.1653769175291626),
+                                    ("<day-of-month>(ordinal) <named-month> year<time-of-day>  o'clock",
+                                     -6.23342985266278),
+                                    ("monthyear", -4.528681760424354),
+                                    ("yearhour", -6.23342985266278),
+                                    ("Juliintersect", -6.23342985266278),
+                                    ("intersect<time-of-day>  o'clock", -4.093363689166509),
+                                    ("christmasyear", -6.23342985266278),
+                                    ("after lunchat <time-of-day>", -6.23342985266278),
+                                    ("absorption of , after named daymm/dd/yyyy",
+                                     -6.23342985266278),
+                                    ("intersectJuli", -5.540282672102834),
+                                    ("<day-of-month> (ordinal)Dienstag", -6.23342985266278),
+                                    ("intersect by 'of', 'from', 'syear", -5.827964744554615),
+                                    ("<time-of-day> am|pmintersect", -5.13481756399467),
+                                    ("<day-of-month> (ordinal)September", -5.827964744554615),
+                                    ("intersect<time> <part-of-day>", -4.153988310982943),
+                                    ("<time-of-day>  o'clockafter lunch", -5.540282672102834),
+                                    ("<day-of-month> (ordinal)Mittwoch", -6.23342985266278),
+                                    ("Montagthis <cycle>", -6.23342985266278),
+                                    ("<time> <part-of-day><time-of-day>  o'clock",
+                                     -6.23342985266278),
+                                    ("Oktoberyear", -5.13481756399467),
+                                    ("today<time-of-day>  o'clock", -6.23342985266278),
+                                    ("<time-of-day>  o'clockon <date>", -5.827964744554615),
+                                    ("<time-of-day> am|pmintersect by ','", -5.540282672102834),
+                                    ("intersect by ','year", -5.13481756399467),
+                                    ("on <date><time-of-day>  o'clock", -6.23342985266278),
+                                    ("exactly <time-of-day>tomorrow", -5.827964744554615),
+                                    ("mm/dd<time-of-day>  o'clock", -6.23342985266278),
+                                    ("monthhour", -5.827964744554615),
+                                    ("on <date>between <datetime> and <datetime> (interval)",
+                                     -6.23342985266278),
+                                    ("last <day-of-week> of <time>year", -6.23342985266278),
+                                    ("hourmonth", -5.827964744554615),
+                                    ("todayat <time-of-day>", -5.540282672102834),
+                                    ("mm/ddabout <time-of-day>", -5.827964744554615),
+                                    ("Donnerstagfrom <datetime> - <datetime> (interval)",
+                                     -5.827964744554615),
+                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
+                                     -6.23342985266278),
+                                    ("on <date>at <time-of-day>", -5.827964744554615),
+                                    ("dayday", -3.055376022314834),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.827964744554615),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -6.23342985266278),
+                                    ("about <time-of-day>on <date>", -6.23342985266278),
+                                    ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
+                                     -5.827964744554615),
+                                    ("<day-of-month> (ordinal)intersect", -5.13481756399467),
+                                    ("hourhour", -3.707701208354524),
+                                    ("hh:mmintersect by ','", -4.9806668841674115),
+                                    ("Donnerstagfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.540282672102834),
+                                    ("Dienstagthis <cycle>", -6.23342985266278),
+                                    ("<part-of-day> of <time>Februar", -5.827964744554615),
+                                    ("dayyear", -3.3156591205785),
+                                    ("Mittwochthis <cycle>", -6.23342985266278),
+                                    ("<time-of-day>  o'clockin|during the <part-of-day>",
+                                     -5.13481756399467),
+                                    ("tomorrow<time-of-day>  o'clock", -6.23342985266278),
+                                    ("<time-of-day>  o'clocktomorrow", -5.540282672102834),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -5.827964744554615),
+                                    ("half <integer> (german style hour-of-day)after lunch",
+                                     -6.23342985266278),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
+                                     -4.9806668841674115),
+                                    ("hourminute", -5.540282672102834),
+                                    ("the <day-of-month> (ordinal)Juli", -6.23342985266278),
+                                    ("on <date><day-of-month>(ordinal) <named-month>",
+                                     -5.827964744554615),
+                                    ("minutemonth", -3.559281203236251),
+                                    ("minutehour", -3.9821380540562843),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.3171391207886245),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
+                                     -5.827964744554615),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -5.13481756399467),
+                                    ("<day-of-month>(ordinal) <named-month> year<time> <part-of-day>",
+                                     -6.23342985266278),
+                                    ("<hour-of-day> <integer> (as relative minutes)after lunch",
+                                     -6.23342985266278),
+                                    ("Donnerstag<time> timezone", -6.23342985266278),
+                                    ("Samstagat <time-of-day>", -5.827964744554615),
+                                    ("<time-of-day> am|pmSamstag", -6.23342985266278),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -4.847135491542889),
+                                    ("this <part-of-day><time-of-day>  o'clock", -6.23342985266278),
+                                    ("<day-of-month>(ordinal) <named-month>intersect",
+                                     -6.23342985266278),
+                                    ("hh:mmintersect", -3.7910828172935753),
+                                    ("Donnerstaghh:mm", -6.23342985266278),
+                                    ("<day-of-month> (ordinal)Juli", -5.540282672102834),
+                                    ("intersect by ','intersect", -4.9806668841674115),
+                                    ("intersect by 'of', 'from', 'sJuli", -6.23342985266278),
+                                    ("<day-of-month> (ordinal)Oktober", -6.23342985266278),
+                                    ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
+                                     -5.827964744554615),
+                                    ("from <datetime> - <datetime> (interval)year",
+                                     -5.540282672102834),
+                                    ("at <time-of-day>intersect", -4.441670383434724),
+                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
+                                     -5.827964744554615),
+                                    ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
+                                     -6.23342985266278),
+                                    ("absorption of , after named day<day-of-month> (ordinal)",
+                                     -4.9806668841674115),
+                                    ("Donnerstagbetween <time-of-day> and <time-of-day> (interval)",
+                                     -6.23342985266278),
+                                    ("dayminute", -4.03620527532656),
+                                    ("on <date>from <datetime> - <datetime> (interval)",
+                                     -6.23342985266278),
+                                    ("Mittwochnext <cycle>", -6.23342985266278),
+                                    ("Donnerstagbetween <datetime> and <datetime> (interval)",
+                                     -6.23342985266278),
+                                    ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
+                                     -6.23342985266278),
+                                    ("intersectyear", -4.441670383434724),
+                                    ("on <date>intersect", -5.827964744554615),
+                                    ("on <date><day-of-month> (ordinal)", -5.827964744554615),
+                                    ("intersectSeptember", -3.4925898287375787),
+                                    ("<ordinal> <cycle> of <time>year", -6.23342985266278),
+                                    ("minuteday", -2.2537481987608188),
+                                    ("absorption of , after named dayintersect",
+                                     -3.835534579864409),
+                                    ("intersect by ','September", -4.729352455886505),
+                                    ("year<time-of-day>  o'clock", -6.23342985266278),
+                                    ("Juliyear", -5.827964744554615),
+                                    ("at <time-of-day>intersect by ','", -5.540282672102834),
+                                    ("hh:mmabsorption of , after named day", -5.827964744554615),
+                                    ("intersect by ','<time> <part-of-day>", -5.3171391207886245),
+                                    ("hh:mmon <date>", -3.7910828172935753),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.23342985266278),
+                                    ("until <time-of-day>after lunch", -6.23342985266278),
+                                    ("mm/ddyear", -5.827964744554615),
+                                    ("intersect by ','<time-of-day>  o'clock", -5.3171391207886245),
+                                    ("intersect<day-of-month> (ordinal)", -4.847135491542889),
+                                    ("absorption of , after named daymm/dd", -6.23342985266278),
+                                    ("on <date>September", -5.3171391207886245),
+                                    ("Septemberyear", -5.827964744554615),
+                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
+                                     -5.540282672102834),
+                                    ("at <time-of-day>on <date>", -4.361627675761188),
+                                    ("intersectintersect", -4.093363689166509),
+                                    ("<day-of-month> (ordinal)Februar", -5.13481756399467),
+                                    ("dayweek", -5.13481756399467),
+                                    ("intersect by ','Juli", -5.540282672102834),
+                                    ("absorption of , after named daythe <day-of-month> (ordinal)",
+                                     -6.23342985266278),
+                                    ("weekyear", -5.827964744554615),
+                                    ("hh:mmin|during the <part-of-day>", -5.3171391207886245),
+                                    ("Marzyear", -6.23342985266278),
+                                    ("tomorrowat <time-of-day>", -5.827964744554615),
+                                    ("<hour-of-day> <integer> (as relative minutes)on <date>",
+                                     -6.23342985266278),
+                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
+                                     -6.23342985266278),
+                                    ("Donnerstag<datetime> - <datetime> (interval)",
+                                     -6.23342985266278),
+                                    ("Sonntaglast <cycle>", -6.23342985266278),
+                                    ("at <time-of-day>tomorrow", -6.23342985266278),
+                                    ("about <time-of-day>in|during the <part-of-day>",
+                                     -5.827964744554615),
+                                    ("half <integer> (german style hour-of-day)on <date>",
+                                     -6.23342985266278),
+                                    ("this <part-of-day>at <time-of-day>", -5.827964744554615),
+                                    ("<datetime> - <datetime> (interval)Juli", -5.827964744554615),
+                                    ("after lunch<hour-of-day> <integer> (as relative minutes)",
+                                     -5.827964744554615),
+                                    ("<day-of-month> (ordinal)Marz", -6.23342985266278),
+                                    ("last <cycle> of <time>year", -5.827964744554615),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -6.23342985266278),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -6.23342985266278)],
+                               n = 426},
+                   koData =
+                     ClassData{prior = -1.4651344228276666, unseen = -6.049733455231958,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juli<day-of-month> (non ordinal) <named-month>",
+                                     -5.354224998486333),
+                                    ("absorption of , after named daythe <day-of-month> (non ordinal)",
+                                     -5.354224998486333),
+                                    ("<datetime> - <datetime> (interval)year", -5.354224998486333),
+                                    ("dayhour", -4.661077817926388),
+                                    ("<named-month> <day-of-month> (non ordinal)Juli",
+                                     -5.354224998486333),
+                                    ("daymonth", -3.4824228215847413),
+                                    ("monthday", -4.948759890378168),
+                                    ("monthyear", -5.354224998486333),
+                                    ("yearhour", -5.354224998486333),
+                                    ("after lunchat <time-of-day>", -4.948759890378168),
+                                    ("mm/dduntil <time-of-day>", -4.948759890378168),
+                                    ("until <time-of-day>year", -4.948759890378168),
+                                    ("<day-of-month> (ordinal)Dienstag", -4.948759890378168),
+                                    ("absorption of , after named dayFebruar", -4.255612709818223),
+                                    ("on <date>Februar", -5.354224998486333),
+                                    ("intersect by 'of', 'from', 'syear", -4.661077817926388),
+                                    ("<time-of-day> am|pmintersect", -3.6494769062479073),
+                                    ("intersect<time> <part-of-day>", -5.354224998486333),
+                                    ("<time-of-day>  o'clockafter lunch", -5.354224998486333),
+                                    ("<day-of-month> (ordinal)Mittwoch", -5.354224998486333),
+                                    ("after lunch<time-of-day>  o'clock", -5.354224998486333),
+                                    ("absorption of , after named dayhh:mm", -5.354224998486333),
+                                    ("<time-of-day> am|pmintersect by ','", -4.101462029990965),
+                                    ("<time-of-day>  o'clock<time> <part-of-day>",
+                                     -4.437934266612178),
+                                    ("<time-of-day> am|pmFreitag", -4.948759890378168),
+                                    ("mm/ddhh:mm", -4.437934266612178),
+                                    ("monthhour", -5.354224998486333),
+                                    ("on <date>between <datetime> and <datetime> (interval)",
+                                     -5.354224998486333),
+                                    ("todayat <time-of-day>", -5.354224998486333),
+                                    ("Donnerstagfrom <datetime> - <datetime> (interval)",
+                                     -4.948759890378168),
+                                    ("on <date>between <time-of-day> and <time-of-day> (interval)",
+                                     -5.354224998486333),
+                                    ("dayday", -3.9679306373664422),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -4.948759890378168),
+                                    ("hourhour", -3.8501476017100584),
+                                    ("Donnerstagfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.661077817926388),
+                                    ("Donnerstagafter <time-of-day>", -5.354224998486333),
+                                    ("dayyear", -3.274783456806497),
+                                    ("minutemonth", -3.4824228215847413),
+                                    ("Aprilyear", -5.354224998486333),
+                                    ("Dienstagafter <time-of-day>", -5.354224998486333),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -4.661077817926388),
+                                    ("Donnerstaghh:mm", -5.354224998486333),
+                                    ("<day-of-month> (ordinal)Juli", -4.948759890378168),
+                                    ("<day-of-month> (ordinal)hh:mm", -4.437934266612178),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.354224998486333),
+                                    ("August<day-of-month> (non ordinal) <named-month>",
+                                     -5.354224998486333),
+                                    ("at <time-of-day>intersect", -4.255612709818223),
+                                    ("on <date>from <time-of-day> - <time-of-day> (interval)",
+                                     -4.948759890378168),
+                                    ("Donnerstagbetween <time-of-day> and <time-of-day> (interval)",
+                                     -5.354224998486333),
+                                    ("dayminute", -2.715167668871074),
+                                    ("on <date>from <datetime> - <datetime> (interval)",
+                                     -5.354224998486333),
+                                    ("Donnerstagbetween <datetime> and <datetime> (interval)",
+                                     -5.354224998486333),
+                                    ("until <time-of-day>Juli", -5.354224998486333),
+                                    ("intersectSeptember", -3.744787086052232),
+                                    ("minuteday", -2.3584927249323417),
+                                    ("intersect by ','September", -4.661077817926388),
+                                    ("at <time-of-day>intersect by ','", -4.661077817926388),
+                                    ("at <time-of-day>Freitag", -5.354224998486333),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -5.354224998486333),
+                                    ("year<time> <part-of-day>", -5.354224998486333),
+                                    ("mm/ddyear", -3.8501476017100584),
+                                    ("intersect<day-of-month> (ordinal)", -4.661077817926388),
+                                    ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
+                                     -4.948759890378168),
+                                    ("intersectintersect", -4.661077817926388),
+                                    ("Donnerstag<part-of-day> of <time>", -5.354224998486333),
+                                    ("<day-of-month> (ordinal)April", -5.354224998486333),
+                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
+                                     -5.354224998486333),
+                                    ("after <time-of-day>year", -5.354224998486333),
+                                    ("on <date>after <time-of-day>", -5.354224998486333),
+                                    ("tomorrownoon", -5.354224998486333)],
+                               n = 128}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7047480922384253),
+                                    ("ordinals (first..19th)week (grain)Oktober",
+                                     -1.7047480922384253),
+                                    ("ordinals (first..19th)day (grain)Oktober",
+                                     -1.7047480922384253),
+                                    ("ordinals (first..19th)week (grain)intersect",
+                                     -1.7047480922384253),
+                                    ("weekmonth", -1.2992829841302609)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        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}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.2039728043259361, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.159484249353372),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.5649493574615367),
+                                    ("hh:mmhh:mm", -2.159484249353372),
+                                    ("dayday", -1.8718021769015913),
+                                    ("hourhour", -2.5649493574615367),
+                                    ("mm/ddmm/dd", -1.8718021769015913)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.3513752571634776),
+                                    ("mm/ddmm/dd/yyyy", -2.3513752571634776),
+                                    ("hh:mmtime-of-day (latent)", -2.639057329615259),
+                                    ("mm/ddhh:mm", -2.3513752571634776),
+                                    ("dayday", -1.791759469228055),
+                                    ("minutehour", -2.639057329615259),
+                                    ("mm/ddintersect", -2.3513752571634776),
+                                    ("dayminute", -2.3513752571634776),
+                                    ("mm/ddtime-of-day (latent)", -2.3513752571634776)],
+                               n = 14}}),
+       ("after tomorrow",
+        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,
+                               unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("month (grain)", -2.3025850929940455),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -1.6094379124341003),
+                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
+                                    ("month", -2.3025850929940455),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("week (grain)", -1.6094379124341003)],
+                               n = 1}}),
+       ("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.5596157879354228, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.252762968495368),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -1.9459101490553135),
+                                    ("hh:mmhh:mm", -1.252762968495368),
+                                    ("hourhour", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 3}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1}}),
+       ("mm/dd/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("couple",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("<ordinal> quarter <year>",
+        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}}),
+       ("after lunch",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter to|till|before <integer> (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}}),
+       ("Allerheiligen",
+        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> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0296194171811581),
+                                    ("ordinals (first..19th)Dienstagintersect",
+                                     -1.9459101490553135),
+                                    ("ordinals (first..19th)Mittwochintersect", -1.540445040947149),
+                                    ("ordinals (first..19th)DienstagOktober", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (first..19th)DienstagSeptember", -1.791759469228055),
+                                    ("ordinals (first..19th)MittwochOktober", -1.3862943611198906)],
+                               n = 3}}),
+       ("the <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1}}),
+       ("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}}),
+       ("week (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}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -0.9444616088408514),
+                                    ("morning<day-of-month>(ordinal) <named-month>",
+                                     -1.791759469228055),
+                                    ("morningintersect", -1.791759469228055),
+                                    ("morning<day-of-month> (ordinal)", -1.791759469228055)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("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,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("half <integer> (german style hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.7047480922384253),
+                                    ("time-of-day (latent)", -1.0116009116784799),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("evening", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Montag",
+        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}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.4657359027997265,
+                               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},
+                   koData =
+                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)Juli", -1.466337068793427),
+                                    ("ordinal (digits)April", -1.8718021769015913),
+                                    ("month", -1.1786549963416462)],
+                               n = 3}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 18}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -6.0624621816434854e-2,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("after lunch", -1.6650077635889111),
+                                    ("afternoon", -1.5314763709643884),
+                                    ("hour", -0.7777045685880083), ("evening", -2.512305623976115),
+                                    ("morning", -2.917770732084279)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -2.833213344056216, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("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,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Freitag", -1.252762968495368), ("day", -0.8472978603872037),
+                                    ("Mittwoch", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after next <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marz", -1.3862943611198906), ("Freitag", -1.3862943611198906),
+                                    ("day", -1.3862943611198906), ("month", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        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 <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("ordinal (digits)", 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.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2039728043259361),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -1.2039728043259361),
+                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        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}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.3862943611198906),
+                                    ("time-of-day (latent)", -1.3862943611198906),
+                                    ("hour", -0.7576857016975165)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.3862943611198906),
+                                    ("<time-of-day> am|pm", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262)],
+                               n = 2}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.5455111817538806,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.909090264423089e-2),
+                                    ("integer (0..19)", -2.3608540011180215)],
+                               n = 51},
+                   koData =
+                     ClassData{prior = -0.866418901833982, unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.262364264467491),
+                                    ("integer (0..19)", -1.466337068793427)],
+                               n = 37}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -2.5257286443082556,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 2}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("MontagMarz", -1.6094379124341003),
+                                    ("SonntagMarz", -1.6094379124341003),
+                                    ("Sonntagintersect", -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.8850381883700507, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2380465718564744),
+                                    ("integer (0..19)year (grain)", -3.2188758248682006),
+                                    ("integer (numeric)day (grain)", -2.70805020110221),
+                                    ("couplehour (grain)", -3.624340932976365),
+                                    ("integer (0..19)hour (grain)", -3.2188758248682006),
+                                    ("second", -3.624340932976365),
+                                    ("integer (numeric)year (grain)", -3.624340932976365),
+                                    ("day", -2.70805020110221), ("year", -2.9311937524164198),
+                                    ("integer (numeric)week (grain)", -2.9311937524164198),
+                                    ("integer (0..19)month (grain)", -3.624340932976365),
+                                    ("integer (0..19)second (grain)", -3.624340932976365),
+                                    ("hour", -2.70805020110221), ("month", -3.624340932976365),
+                                    ("integer (numeric)minute (grain)", -2.5257286443082556),
+                                    ("integer (0..19)minute (grain)", -3.624340932976365),
+                                    ("minute", -2.371577964480997),
+                                    ("integer (numeric)hour (grain)", -3.624340932976365),
+                                    ("integer (0..19)week (grain)", -2.70805020110221)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -0.5322168137473082, unseen = -4.584967478670572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.62880082944807),
+                                    ("integer (0..19)year (grain)", -2.9652730660692823),
+                                    ("integer (numeric)day (grain)", -3.4760986898352733),
+                                    ("integer (0..19)hour (grain)", -3.8815637979434374),
+                                    ("second", -2.9652730660692823),
+                                    ("integer (numeric)second (grain)", -3.4760986898352733),
+                                    ("integer (numeric)year (grain)", -3.4760986898352733),
+                                    ("day", -2.3774864011671633), ("year", -2.62880082944807),
+                                    ("integer (numeric)week (grain)", -3.188416617383492),
+                                    ("integer (0..19)month (grain)", -2.9652730660692823),
+                                    ("integer (0..19)second (grain)", -3.4760986898352733),
+                                    ("hour", -3.188416617383492), ("month", -2.62880082944807),
+                                    ("integer (numeric)minute (grain)", -3.4760986898352733),
+                                    ("integer (0..19)minute (grain)", -3.4760986898352733),
+                                    ("integer (numeric)month (grain)", -3.4760986898352733),
+                                    ("minute", -2.9652730660692823),
+                                    ("coupleday (grain)", -3.4760986898352733),
+                                    ("integer (numeric)hour (grain)", -3.4760986898352733),
+                                    ("integer (0..19)day (grain)", -2.9652730660692823),
+                                    ("integer (0..19)week (grain)", -3.188416617383492)],
+                               n = 37}}),
+       ("Dienstag",
+        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}}),
+       ("ordinals (first..19th)",
+        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}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -1.845826690498331, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -2.0794415416798357),
+                                    ("hh:mm", -2.0794415416798357),
+                                    ("until <time-of-day>", -2.0794415416798357),
+                                    ("hour", -1.6739764335716716), ("minute", -2.0794415416798357)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.17185025692665928,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.3513752571634776),
+                                    ("<time-of-day>  o'clock", -2.3513752571634776),
+                                    ("half <integer> (german style hour-of-day)",
+                                     -3.044522437723423),
+                                    ("about <time-of-day>", -3.044522437723423),
+                                    ("time-of-day (latent)", -2.128231705849268),
+                                    ("hh:mm", -2.3513752571634776), ("hour", -1.4350845252893227),
+                                    ("minute", -1.6582280766035324),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -3.044522437723423)],
+                               n = 16}}),
+       ("<duration> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>christmas", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>christmas", -1.252762968495368),
+                                    ("yearday", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8472978603872037),
+                                    ("integer (numeric)time-of-day (latent)", -1.252762968495368),
+                                    ("integer (20..90)time-of-day (latent)", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mittwoch",
+        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}}),
+       ("Oktober",
+        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}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9924301646902063),
+                                    ("hour (grain)", -2.3978952727983707),
+                                    ("year (grain)", -2.3978952727983707),
+                                    ("second", -2.3978952727983707),
+                                    ("week (grain)", -1.9924301646902063),
+                                    ("minute (grain)", -2.3978952727983707),
+                                    ("year", -2.3978952727983707),
+                                    ("second (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707), ("minute", -2.3978952727983707)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dd.(mm.)? - dd.mm.(yy[yy]?)? (interval)",
+        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}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.6190392084062235,
+                               unseen = -3.6109179126442243,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 35},
+                   koData =
+                     ClassData{prior = -0.7731898882334817,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("quarter after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.5040773967762742),
+                                    ("time-of-day (latent)", -1.0986122886681098),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -0.6931471805599453),
+                                    ("minutehour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by ','",
+        Classifier{okData =
+                     ClassData{prior = -0.2531958963806117,
+                               unseen = -5.0106352940962555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Freitag<day-of-month>(ordinal) <named-month> year",
+                                     -3.9053340172773496),
+                                    ("dayhour", -2.8067217286092396),
+                                    ("Freitagintersect", -2.0082140323914683),
+                                    ("Samstag<day-of-month>(ordinal) <named-month>",
+                                     -4.310799125385514),
+                                    ("Freitagmm/dd/yyyy", -3.9053340172773496),
+                                    ("Freitagmm/dd", -3.9053340172773496),
+                                    ("dayday", -1.3403846598158127),
+                                    ("Samstagintersect", -4.310799125385514),
+                                    ("dayyear", -4.310799125385514),
+                                    ("Freitag<day-of-month>(ordinal) <named-month>",
+                                     -3.6176519448255684),
+                                    ("Freitagthe <day-of-month> (ordinal)", -4.310799125385514),
+                                    ("on <date><day-of-month>(ordinal) <named-month>",
+                                     -3.9053340172773496),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -3.3945083935113587),
+                                    ("Freitag<day-of-month> (ordinal)", -3.6176519448255684),
+                                    ("on <date>intersect", -3.9053340172773496),
+                                    ("on <date><day-of-month> (ordinal)", -3.9053340172773496),
+                                    ("minuteday", -2.4389969484839225),
+                                    ("Montag<named-month> <day-of-month> (non ordinal)",
+                                     -3.6176519448255684),
+                                    ("Sonntag<named-month> <day-of-month> (non ordinal)",
+                                     -4.310799125385514),
+                                    ("intersect<day-of-month> (ordinal)", -3.3945083935113587),
+                                    ("intersectintersect", -3.3945083935113587),
+                                    ("Samstag<day-of-month> (ordinal)", -4.310799125385514),
+                                    ("Mittwoch<named-month> <day-of-month> (non ordinal)",
+                                     -4.310799125385514),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -4.310799125385514)],
+                               n = 59},
+                   koData =
+                     ClassData{prior = -1.497519996230115, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.382627800667582),
+                                    ("dayday", -3.481240089335692),
+                                    ("SonntagFebruar", -3.481240089335692),
+                                    ("MontagFebruar", -2.7880929087757464),
+                                    ("Freitagthe <day-of-month> (non ordinal)", -3.481240089335692),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -2.7880929087757464),
+                                    ("dayminute", -3.0757749812275272),
+                                    ("MittwochFebruar", -3.481240089335692),
+                                    ("minuteday", -1.8718021769015913),
+                                    ("Freitaghh:mm", -3.0757749812275272),
+                                    ("intersect<day-of-month> (ordinal)", -2.7880929087757464),
+                                    ("intersectintersect", -2.7880929087757464)],
+                               n = 17}}),
+       ("second (grain)",
+        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}}),
+       ("Februar",
+        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}}),
+       ("intersect by 'of', 'from', 's",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -4.248495242049359,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.2881963555419462),
+                                    ("intersectOktober", -3.1354942159291497),
+                                    ("Mittwochintersect", -3.5409593240373143),
+                                    ("on <date>hh:mm", -3.5409593240373143),
+                                    ("dayday", -2.624668592163159),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
+                                     -3.5409593240373143),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
+                                     -3.5409593240373143),
+                                    ("on <date><time-of-day> - <time-of-day> (interval)",
+                                     -3.5409593240373143),
+                                    ("on <date><datetime> - <datetime> (interval)",
+                                     -3.5409593240373143),
+                                    ("Donnerstaghh:mm", -3.1354942159291497),
+                                    ("absorption of , after named day<day-of-month> (ordinal)",
+                                     -3.5409593240373143),
+                                    ("dayminute", -1.9315214116032136),
+                                    ("Mittwochnext <cycle>", -3.5409593240373143),
+                                    ("absorption of , after named dayintersect",
+                                     -3.5409593240373143),
+                                    ("DienstagOktober", -3.5409593240373143),
+                                    ("MittwochOktober", -3.5409593240373143),
+                                    ("intersectintersect", -3.5409593240373143),
+                                    ("dayweek", -3.1354942159291497),
+                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
+                                     -3.1354942159291497),
+                                    ("Donnerstag<datetime> - <datetime> (interval)",
+                                     -3.1354942159291497),
+                                    ("Sonntaglast <cycle>", -3.5409593240373143)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.0116009116784799, unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.62924053973028),
+                                    ("intersectOktober", -3.2386784521643803),
+                                    ("Mittwochintersect", -3.2386784521643803),
+                                    ("Dienstagintersect", -3.2386784521643803),
+                                    ("DienstagSeptember", -3.2386784521643803),
+                                    ("on <date><time-of-day> - <time-of-day> (interval)",
+                                     -3.2386784521643803),
+                                    ("MontagMarz", -3.2386784521643803),
+                                    ("dayminute", -2.5455312716044354),
+                                    ("SonntagMarz", -3.2386784521643803),
+                                    ("intersectSeptember", -3.2386784521643803),
+                                    ("MittwochOktober", -3.2386784521643803),
+                                    ("Sonntagintersect", -3.2386784521643803),
+                                    ("Donnerstag<time-of-day> - <time-of-day> (interval)",
+                                     -2.833213344056216)],
+                               n = 12}}),
+       ("Donnerstag",
+        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}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.4816045409242156), ("day", -1.9924301646902063),
+                                    ("year", -2.3978952727983707),
+                                    ("<integer> <unit-of-duration>", -1.0116009116784799),
+                                    ("a <unit-of-duration>", -2.3978952727983707),
+                                    ("month", -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sonntag", -1.5040773967762742), ("day", -1.0986122886681098),
+                                    ("Dienstag", -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.8023464725249373),
+                                    ("hour", -0.8023464725249373)],
+                               n = 12}}),
+       ("EOM|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}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.5520685823000397,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)", -1.6582280766035324),
+                                    ("ordinal (digits)", -0.2113090936672069)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.8574502318512216, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)", -0.8266785731844679),
+                                    ("ordinal (digits)", -0.5753641449035618)],
+                               n = 14}}),
+       ("noon",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.1316272948504063),
+                                    ("<time-of-day>  o'clock", -2.2857779746776643),
+                                    ("intersect", -3.3843902633457743),
+                                    ("time-of-day (latent)", -2.1316272948504063),
+                                    ("<time-of-day> am|pm", -3.3843902633457743),
+                                    ("EOM|End of month", -3.3843902633457743),
+                                    ("hour", -1.0330150061822965), ("month", -3.3843902633457743),
+                                    ("midnight|EOD|end of day", -3.3843902633457743)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.70805020110221),
+                                    ("intersect", -2.4203681286504293),
+                                    ("mm/dd/yyyy", -2.70805020110221),
+                                    ("<day-of-month>(ordinal) <named-month>", -3.1135153092103742),
+                                    ("day", -1.4087672169719492), ("hh:mm", -2.1972245773362196),
+                                    ("<day-of-month> (ordinal)", -3.1135153092103742),
+                                    ("<day-of-month> (non ordinal) <named-month>",
+                                     -3.1135153092103742),
+                                    ("minute", -2.1972245773362196)],
+                               n = 14}}),
+       ("<integer> and an half hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (0..19)", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Nikolaus",
+        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}}),
+       ("evening",
+        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}}),
+       ("midnight|EOD|end of 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-of-day> until",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marz", -2.1972245773362196), ("Montag", -1.791759469228055),
+                                    ("day", -1.0986122886681098), ("Dienstag", -1.791759469228055),
+                                    ("Mittwoch", -2.1972245773362196),
+                                    ("month", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.5040773967762742),
+                                    ("month (grain)", -2.1972245773362196),
+                                    ("year (grain)", -2.1972245773362196),
+                                    ("week (grain)", -1.5040773967762742),
+                                    ("year", -2.1972245773362196), ("month", -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("week (grain)", -1.791759469228055),
+                                    ("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,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.740840023925201),
+                                    ("integer (0..19)year (grain)", -3.028522096376982),
+                                    ("integer (numeric)day (grain)", -3.4339872044851463),
+                                    ("integer (0..19)hour (grain)", -3.4339872044851463),
+                                    ("second", -3.028522096376982),
+                                    ("integer (numeric)second (grain)", -3.4339872044851463),
+                                    ("integer (numeric)year (grain)", -3.4339872044851463),
+                                    ("day", -2.3353749158170367), ("year", -2.740840023925201),
+                                    ("integer (numeric)week (grain)", -3.4339872044851463),
+                                    ("integer (0..19)month (grain)", -3.028522096376982),
+                                    ("integer (0..19)second (grain)", -3.4339872044851463),
+                                    ("hour", -3.028522096376982), ("month", -2.740840023925201),
+                                    ("integer (numeric)minute (grain)", -3.4339872044851463),
+                                    ("integer (0..19)minute (grain)", -3.4339872044851463),
+                                    ("integer (numeric)month (grain)", -3.4339872044851463),
+                                    ("minute", -3.028522096376982),
+                                    ("coupleday (grain)", -3.028522096376982),
+                                    ("integer (numeric)hour (grain)", -3.4339872044851463),
+                                    ("integer (0..19)day (grain)", -3.028522096376982),
+                                    ("integer (0..19)week (grain)", -3.028522096376982)],
+                               n = 20},
+                   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,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("hh:mm", -1.791759469228055), ("hour", -1.0986122886681098),
+                                    ("minute", -1.791759469228055)],
+                               n = 4}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.07753744390572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6741486494265287),
+                                    ("number.number hours", -3.367295829986474),
+                                    ("second", -2.9618307218783095), ("day", -2.9618307218783095),
+                                    ("half an hour", -3.367295829986474),
+                                    ("year", -3.367295829986474),
+                                    ("<integer> <unit-of-duration>", -1.2878542883066382),
+                                    ("a <unit-of-duration>", -2.451005098112319),
+                                    ("<integer> and an half hours", -3.367295829986474),
+                                    ("hour", -2.268683541318364), ("minute", -1.6625477377480489),
+                                    ("about <duration>", -3.367295829986474)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.9694005571881036, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.481240089335692),
+                                    ("on <date>hh:mm", -3.481240089335692),
+                                    ("minuteminute", -1.6894806201076367),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -3.0757749812275272),
+                                    ("hh:mmhh:mm", -2.228477120840324),
+                                    ("dayday", -1.6894806201076367),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.0757749812275272),
+                                    ("intersect by 'of', 'from', 'shh:mm", -2.7880929087757464),
+                                    ("mm/ddmm/dd", -2.094945728215801)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -0.4769240720903093, unseen = -4.543294782270004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)<day-of-month>(ordinal) <named-month>",
+                                     -3.4339872044851463),
+                                    ("<named-month> <day-of-month> (non ordinal)Juli",
+                                     -3.8394523125933104),
+                                    ("daymonth", -3.4339872044851463),
+                                    ("mm/ddmm/dd/yyyy", -2.5866893440979424),
+                                    ("<day-of-month> (ordinal)mm/dd", -2.9231615807191553),
+                                    ("mm/ddhh:mm", -2.45315795147342),
+                                    ("dayday", -1.3545456628053103),
+                                    ("<day-of-month> (ordinal)intersect", -3.146305132033365),
+                                    ("<day-of-month> (ordinal)hh:mm", -2.9231615807191553),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -3.8394523125933104),
+                                    ("mm/ddintersect", -2.5866893440979424),
+                                    ("dayminute", -2.0476928433652555),
+                                    ("<day-of-month> (ordinal)mm/dd/yyyy", -3.4339872044851463)],
+                               n = 36}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.8266785731844679, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.916290731874155),
+                                    ("hh:mmhh:mm", -0.916290731874155)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.5753641449035618,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.2321436812926323),
+                                    ("hourminute", -1.791759469228055),
+                                    ("minutehour", -1.2321436812926323),
+                                    ("time-of-day (latent)hh:mm", -1.791759469228055)],
+                               n = 9}}),
+       ("sommer",
+        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}}),
+       ("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}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5257286443082556),
+                                    ("integer (0..19)year (grain)", -2.8134107167600364),
+                                    ("integer (numeric)day (grain)", -3.2188758248682006),
+                                    ("second", -2.8134107167600364),
+                                    ("integer (numeric)second (grain)", -3.2188758248682006),
+                                    ("integer (numeric)year (grain)", -3.2188758248682006),
+                                    ("day", -2.5257286443082556), ("year", -2.5257286443082556),
+                                    ("integer (numeric)week (grain)", -2.8134107167600364),
+                                    ("integer (0..19)month (grain)", -2.8134107167600364),
+                                    ("integer (0..19)second (grain)", -3.2188758248682006),
+                                    ("month", -2.5257286443082556),
+                                    ("integer (numeric)minute (grain)", -3.2188758248682006),
+                                    ("integer (0..19)minute (grain)", -3.2188758248682006),
+                                    ("integer (numeric)month (grain)", -3.2188758248682006),
+                                    ("minute", -2.8134107167600364),
+                                    ("integer (0..19)day (grain)", -2.8134107167600364),
+                                    ("integer (0..19)week (grain)", -3.2188758248682006)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)Dienstagintersect", -0.916290731874155),
+                                    ("dayday", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..19th)Dienstagchristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.1972245773362196),
+                                    ("Marzinteger (numeric)", -2.4849066497880004),
+                                    ("Februarinteger (numeric)", -1.5040773967762742),
+                                    ("Aprilinteger (numeric)", -2.890371757896165),
+                                    ("month", -0.8109302162163288),
+                                    ("Juliinteger (numeric)", -2.4849066497880004)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.1400661634962708,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Aprilinteger (numeric)", -1.6094379124341003),
+                                    ("month", -1.2039728043259361),
+                                    ("Juliinteger (numeric)", -1.6094379124341003)],
+                               n = 2}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Marz", -1.5040773967762742),
+                                    ("integer (numeric)April", -1.5040773967762742),
+                                    ("month", -1.0986122886681098)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)August", -1.8718021769015913),
+                                    ("month", -0.9555114450274363),
+                                    ("integer (numeric)Juli", -1.1786549963416462)],
+                               n = 4}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Montag", -1.3862943611198906), ("day", -0.8266785731844679),
+                                    ("Dienstag", -1.6739764335716716),
+                                    ("Mittwoch", -2.0794415416798357)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> after",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("quarter (grain)",
+        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 <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.540445040947149),
+                                    ("day (grain)intersect", -1.9459101490553135),
+                                    ("weekmonth", -1.540445040947149),
+                                    ("day (grain)Oktober", -1.9459101490553135),
+                                    ("week (grain)intersect", -1.9459101490553135),
+                                    ("week (grain)September", -1.9459101490553135)],
+                               n = 4},
+                   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 = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)Juli", -1.0116009116784799),
+                                    ("ordinal (digits)April", -1.7047480922384253),
+                                    ("month", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Samstag",
+        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}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -1.540445040947149),
+                                    ("time-of-day (latent)", -1.540445040947149),
+                                    ("hour", -0.9343092373768334)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day>  o'clock", -2.3025850929940455),
+                                    ("intersect", -2.3025850929940455),
+                                    ("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)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juli", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <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}}),
+       ("<hour-of-day> <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7731898882334817),
+                                    ("at <time-of-day>integer (numeric)", -1.8718021769015913),
+                                    ("<time-of-day>  o'clockinteger (numeric)",
+                                     -0.9555114450274363)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Montag", -1.9459101490553135), ("day", -1.252762968495368),
+                                    ("hour", -1.9459101490553135), ("sommer", -1.9459101490553135),
+                                    ("winter", -1.9459101490553135),
+                                    ("week-end", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("within <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("before yesterday",
+        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",
+        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}})]
diff --git a/Duckling/Ranking/Classifiers/EN.hs b/Duckling/Ranking/Classifiers/EN.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/EN.hs
+++ /dev/null
@@ -1,2190 +0,0 @@
--- 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.EN (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<integer> to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.791759469228055, 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.1823215567939546, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7731898882334817),
-                                    ("integer (numeric)time-of-day (latent)", -0.7731898882334817)],
-                               n = 5}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.7047480922384253),
-                                    ("<time-of-day> am|pm", -1.7047480922384253),
-                                    ("hh:mm", -1.7047480922384253), ("hour", -1.2992829841302609),
-                                    ("minute", -1.7047480922384253)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        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 (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.8649974374866046,
-                               unseen = -5.0369526024136295,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 152},
-                   koData =
-                     ClassData{prior = -0.5465437063680699, unseen = -5.351858133476067,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 209}}),
-       ("<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.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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 = -0.916290731874155, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.6094379124341003),
-                                    ("integer (numeric)April", -1.6094379124341003),
-                                    ("month", -1.2039728043259361)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)August", -1.791759469228055),
-                                    ("ordinal (digits)April", -1.791759469228055),
-                                    ("month", -1.0986122886681098),
-                                    ("integer (numeric)July", -1.791759469228055)],
-                               n = 3}}),
-       ("<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.3862943611198906,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.10919929196499197,
-                               unseen = -4.7535901911063645,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -3.6463198396951406),
-                                    ("integer after|past <hour-of-day>", -3.6463198396951406),
-                                    ("half after|past <hour-of-day>", -4.051784947803305),
-                                    ("time-of-day (latent)", -1.8004931491968097),
-                                    ("hhmm (latent)", -3.3586377672433594),
-                                    ("<time-of-day> am|pm", -1.749199854809259),
-                                    ("hh:mm", -3.1354942159291497),
-                                    ("about|exactly <time-of-day>", -3.6463198396951406),
-                                    ("hour", -1.16141318990714),
-                                    ("<time-of-day> sharp|exactly", -4.051784947803305),
-                                    ("minute", -1.8545603704670852)],
-                               n = 52},
-                   koData =
-                     ClassData{prior = -2.268683541318364, unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.1895840668738362),
-                                    ("hour", -1.1895840668738362)],
-                               n = 6}}),
-       ("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 = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   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}}),
-       ("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 = -2.469261259037152e-2,
-                               unseen = -3.7376696182833684,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 40},
-                   koData =
-                     ClassData{prior = -3.713572066704308, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("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 = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("July", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        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}}),
-       ("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.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   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 = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
-                               n = 3}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.4563567154045537, unseen = -6.124683390894205,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.513054897080286),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.513054897080286),
-                                    ("hourday", -3.724597536716016),
-                                    ("dayhour", -3.1780538303479458),
-                                    ("daymonth", -5.429345628954441),
-                                    ("monthday", -5.0238805208462765),
-                                    ("monthyear", -3.8199077165203406),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.429345628954441),
-                                    ("Christmasyear", -5.429345628954441),
-                                    ("houryear", -5.429345628954441),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -5.429345628954441),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.736198448394496),
-                                    ("<time-of-day> am|pmintersect", -4.176582660459073),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -5.429345628954441),
-                                    ("Marchyear", -5.429345628954441),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
-                                     -5.0238805208462765),
-                                    ("intersect<time-of-day> am|pm", -5.429345628954441),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.429345628954441),
-                                    ("monthhour", -5.0238805208462765),
-                                    ("last <day-of-week> of <time>year", -5.429345628954441),
-                                    ("todayat <time-of-day>", -5.429345628954441),
-                                    ("Thursday<time> timezone", -5.0238805208462765),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -5.429345628954441),
-                                    ("dayday", -3.414442608412176),
-                                    ("Thanksgiving Dayyear", -5.0238805208462765),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.429345628954441),
-                                    ("Tuesdayin <named-month>", -5.429345628954441),
-                                    ("mm/ddat <time-of-day>", -5.429345628954441),
-                                    ("tonightat <time-of-day>", -5.429345628954441),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -4.736198448394496),
-                                    ("today<time-of-day> am|pm", -5.429345628954441),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.0238805208462765),
-                                    ("at <time-of-day><time> <part-of-day>", -5.429345628954441),
-                                    ("mm/dd<time-of-day> am|pm", -5.429345628954441),
-                                    ("hourhour", -4.176582660459073),
-                                    ("<time-of-day> am|pmon <date>", -3.414442608412176),
-                                    ("Wednesdaythis|last|next <cycle>", -5.429345628954441),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.925268232178167),
-                                    ("dayyear", -3.2321210516182215),
-                                    ("last weekend of <named-month>year", -5.429345628954441),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -5.429345628954441),
-                                    ("<time-of-day> am|pmtomorrow", -4.736198448394496),
-                                    ("minutehour", -4.513054897080286),
-                                    ("Mother's Dayyear", -5.429345628954441),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.0238805208462765),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -3.724597536716016),
-                                    ("tomorrow<time-of-day> sharp|exactly", -5.429345628954441),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.513054897080286),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.0238805208462765),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.513054897080286),
-                                    ("Mondayin|during the <part-of-day>", -5.429345628954441),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.0238805208462765),
-                                    ("intersectin|during the <part-of-day>", -5.429345628954441),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -5.429345628954441),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.736198448394496),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -4.513054897080286),
-                                    ("at <time-of-day>intersect", -5.0238805208462765),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -5.429345628954441),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.429345628954441),
-                                    ("dayminute", -3.126760535960395),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.0238805208462765),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -5.429345628954441),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.0238805208462765),
-                                    ("<ordinal> <cycle> of <time>year", -5.429345628954441),
-                                    ("minuteday", -2.0281482472922856),
-                                    ("absorption of , after named dayintersect",
-                                     -5.429345628954441),
-                                    ("Octoberyear", -4.176582660459073),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -5.429345628954441),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -5.429345628954441),
-                                    ("<day-of-month> (ordinal or number) <named-month>year",
-                                     -5.429345628954441),
-                                    ("year<time-of-day> am|pm", -5.429345628954441),
-                                    ("Septemberyear", -5.0238805208462765),
-                                    ("at <time-of-day>on <date>", -4.330733340286331),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.736198448394496),
-                                    ("Halloweenyear", -5.429345628954441),
-                                    ("dayweek", -5.429345628954441),
-                                    ("weekyear", -5.0238805208462765),
-                                    ("hh:mmin|during the <part-of-day>", -4.736198448394496),
-                                    ("Father's Dayyear", -5.429345628954441),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.0238805208462765),
-                                    ("February<time> <part-of-day>", -5.429345628954441),
-                                    ("Martin Luther King's Dayyear", -5.0238805208462765),
-                                    ("tomorrowat <time-of-day>", -4.736198448394496),
-                                    ("between <time> and <time>on <date>", -4.736198448394496),
-                                    ("at <time-of-day>tomorrow", -5.0238805208462765),
-                                    ("tomorrow<time-of-day> am|pm", -5.429345628954441),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -5.429345628954441),
-                                    ("Labor Dayyear", -5.429345628954441),
-                                    ("Februaryintersect", -5.429345628954441),
-                                    ("last <cycle> of <time>year", -4.736198448394496),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -5.429345628954441),
-                                    ("yearminute", -5.429345628954441)],
-                               n = 166},
-                   koData =
-                     ClassData{prior = -1.0039963122932607, unseen = -5.75890177387728,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("in <named-month>year", -5.062595033026967),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.062595033026967),
-                                    ("hourday", -5.062595033026967),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.062595033026967),
-                                    ("dayhour", -3.270835563798912),
-                                    ("daymonth", -3.047692012484702),
-                                    ("monthday", -4.657129924918802),
-                                    ("monthyear", -4.3694478524670215),
-                                    ("intersecthh:mm", -5.062595033026967),
-                                    ("houryear", -5.062595033026967),
-                                    ("until <time-of-day><time-of-day> am|pm", -5.062595033026967),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.3694478524670215),
-                                    ("<time-of-day> am|pmintersect", -3.809832064531599),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.146304301152812),
-                                    ("Tuesdayafter <time-of-day>", -5.062595033026967),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.062595033026967),
-                                    ("absorption of , after named dayJuly", -4.657129924918802),
-                                    ("monthhour", -4.657129924918802),
-                                    ("hourmonth", -5.062595033026967),
-                                    ("todayat <time-of-day>", -5.062595033026967),
-                                    ("dayday", -4.657129924918802),
-                                    ("mm/ddat <time-of-day>", -4.657129924918802),
-                                    ("<time-of-day> am|pmon <date>", -3.809832064531599),
-                                    ("dayyear", -4.146304301152812),
-                                    ("Thursdaymm/dd", -5.062595033026967),
-                                    ("Thursdayat <time-of-day>", -5.062595033026967),
-                                    ("August<time-of-day> am|pm", -5.062595033026967),
-                                    ("monthminute", -5.062595033026967),
-                                    ("<time-of-day> am|pmtomorrow", -5.062595033026967),
-                                    ("Thursdayhh:mm", -5.062595033026967),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.062595033026967),
-                                    ("minutemonth", -3.5585176362506927),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.657129924918802),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.657129924918802),
-                                    ("Aprilyear", -5.062595033026967),
-                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
-                                     -4.657129924918802),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.062595033026967),
-                                    ("yesterday<time-of-day> am|pm", -5.062595033026967),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -4.146304301152812),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.062595033026967),
-                                    ("until <time-of-day>on <date>", -4.3694478524670215),
-                                    ("at <time-of-day>intersect", -4.657129924918802),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.062595033026967),
-                                    ("dayminute", -3.1166848839716534),
-                                    ("intersectSeptember", -3.5585176362506927),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.062595033026967),
-                                    ("minuteday", -2.259234652120432),
-                                    ("absorption of , after named dayintersect",
-                                     -5.062595033026967),
-                                    ("Februaryin|during the <part-of-day>", -5.062595033026967),
-                                    ("week-endin <named-month>", -5.062595033026967),
-                                    ("Octoberyear", -5.062595033026967),
-                                    ("yearhh:mm", -5.062595033026967),
-                                    ("hh:mmon <date>", -3.5585176362506927),
-                                    ("absorption of , after named daySeptember",
-                                     -4.146304301152812),
-                                    ("on <date>September", -4.657129924918802),
-                                    ("at <time-of-day>on <date>", -4.657129924918802),
-                                    ("absorption of , after named dayFebruary", -4.146304301152812),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.062595033026967),
-                                    ("tomorrowat <time-of-day>", -5.062595033026967),
-                                    ("tomorrow<time-of-day> am|pm", -5.062595033026967),
-                                    ("after <time-of-day><time-of-day> am|pm", -5.062595033026967),
-                                    ("after <time-of-day>year", -5.062595033026967),
-                                    ("yearminute", -5.062595033026967)],
-                               n = 96}}),
-       ("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.041453874828161, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.5596157879354228),
-                                    ("integer (0..19)", -0.8472978603872037)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.4353180712578455,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3448404862917295),
-                                    ("integer (0..19)", -1.2321436812926323)],
-                               n = 22}}),
-       ("<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.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.5686159179138452),
-                                    ("hh:mmhh:mm", -1.5686159179138452),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -2.4849066497880004),
-                                    ("hourhour", -2.0794415416798357),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm",
-                                     -2.4849066497880004)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.70805020110221),
-                                    ("hh:mmtime-of-day (latent)", -1.791759469228055),
-                                    ("minuteminute", -2.3025850929940455),
-                                    ("time-of-day (latent)time-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("minutehour", -1.791759469228055),
-                                    ("hh:mmintersect", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -2.70805020110221)],
-                               n = 9}}),
-       ("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.6359887667199967,
-                               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.7537718023763802, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.540445040947149),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.2335922215070942),
-                                    ("hourhour", -1.9459101490553135),
-                                    ("minutehour", -1.540445040947149),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -2.639057329615259)],
-                               n = 8}}),
-       ("integer 21..99",
-        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)integer (numeric)", 0.0)],
-                               n = 2}}),
-       ("last|next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.430816798843313,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.627081138568543),
-                                    ("integer (0..19)year (grain)", -3.3202283191284883),
-                                    ("integer (numeric)day (grain)", -3.0325462466767075),
-                                    ("integer (0..19)second (grain) ", -3.3202283191284883),
-                                    ("integer (0..19)hour (grain)", -3.3202283191284883),
-                                    ("second", -2.8094026953624978),
-                                    ("integer (numeric)second (grain) ", -3.3202283191284883),
-                                    ("integer (numeric)year (grain)", -3.3202283191284883),
-                                    ("day", -2.472930458741285), ("year", -2.8094026953624978),
-                                    ("integer (numeric)week (grain)", -3.0325462466767075),
-                                    ("integer (0..19)month (grain)", -3.3202283191284883),
-                                    ("hour", -2.8094026953624978), ("month", -2.8094026953624978),
-                                    ("integer (numeric)minute (grain)", -3.3202283191284883),
-                                    ("integer (0..19)minute (grain)", -3.3202283191284883),
-                                    ("integer (numeric)month (grain)", -3.3202283191284883),
-                                    ("minute", -2.8094026953624978),
-                                    ("integer (numeric)hour (grain)", -3.3202283191284883),
-                                    ("integer (0..19)day (grain)", -3.0325462466767075),
-                                    ("integer (0..19)week (grain)", -3.3202283191284883)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
-                               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}}),
-       ("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 = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>integer (numeric)",
-                                     -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               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.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("now",
-        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}}),
-       ("<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.0, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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.16251892949777494,
-                               unseen = -4.3694478524670215,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5234954826333758),
-                                    ("month (grain)", -2.9704144655697013),
-                                    ("year (grain)", -1.8718021769015913),
-                                    ("week (grain)", -1.5234954826333758),
-                                    ("quarter", -2.7472709142554916), ("year", -1.8718021769015913),
-                                    ("month", -2.9704144655697013),
-                                    ("quarter (grain)", -2.7472709142554916)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -1.8971199848858813,
-                               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.5108256237659907, unseen = -4.143134726391533,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.10178269430994236),
-                                    ("integer (0..19)", -2.3353749158170367)],
-                               n = 60},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -2.409755157906053e-2)],
-                               n = 40}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.24362208265775043,
-                               unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -1.5314763709643884,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 8}}),
-       ("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.758529939822797, unseen = -4.584967478670572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.3774864011671633),
-                                    ("integer (0..19)year (grain)", -3.188416617383492),
-                                    ("integer (numeric)day (grain)", -2.62880082944807),
-                                    ("integer (0..19)second (grain) ", -3.8815637979434374),
-                                    ("integer (0..19)hour (grain)", -2.782951509275328),
-                                    ("second", -3.8815637979434374),
-                                    ("integer (numeric)year (grain)", -3.8815637979434374),
-                                    ("day", -2.62880082944807), ("year", -2.9652730660692823),
-                                    ("integer (numeric)week (grain)", -2.9652730660692823),
-                                    ("integer (0..19)month (grain)", -3.4760986898352733),
-                                    ("hour", -2.495269436823547), ("month", -3.4760986898352733),
-                                    ("integer (numeric)minute (grain)", -2.9652730660692823),
-                                    ("integer (0..19)minute (grain)", -2.782951509275328),
-                                    ("minute", -2.2721258855093374),
-                                    ("integer (numeric)hour (grain)", -3.4760986898352733),
-                                    ("integer (0..19)week (grain)", -2.9652730660692823)],
-                               n = 37},
-                   koData =
-                     ClassData{prior = -0.6317782341836533, unseen = -4.68213122712422,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.8810693652338513),
-                                    ("integer (0..19)year (grain)", -3.5742165457937967),
-                                    ("integer (numeric)day (grain)", -3.2865344733420154),
-                                    ("integer (0..19)second (grain) ", -3.5742165457937967),
-                                    ("integer (0..19)hour (grain)", -3.5742165457937967),
-                                    ("second", -3.0633909220278057),
-                                    ("integer (numeric)second (grain) ", -3.5742165457937967),
-                                    ("integer (numeric)year (grain)", -3.5742165457937967),
-                                    ("day", -2.7269186854065928), ("quarter", -3.979681653901961),
-                                    ("year", -3.0633909220278057),
-                                    ("integer (numeric)week (grain)", -3.2865344733420154),
-                                    ("integer (0..19)month (grain)", -3.5742165457937967),
-                                    ("hour", -1.9647786333596962), ("month", -3.0633909220278057),
-                                    ("integer (numeric)minute (grain)", -3.5742165457937967),
-                                    ("integer (0..19)minute (grain)", -3.5742165457937967),
-                                    ("integer (numeric)month (grain)", -3.5742165457937967),
-                                    ("minute", -3.0633909220278057),
-                                    ("integer (numeric)hour (grain)", -2.1078794770003695),
-                                    ("integer (0..19)day (grain)", -3.2865344733420154),
-                                    ("integer (0..19)week (grain)", -3.5742165457937967),
-                                    ("integer (0..19)quarter (grain)", -3.979681653901961)],
-                               n = 42}}),
-       ("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.29354719190417905,
-                               unseen = -5.231108616854587,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer after|past <hour-of-day>", -3.8394523125933104),
-                                    ("at <time-of-day>", -2.2300144001592104),
-                                    ("<time-of-day> o'clock", -4.127134385045092),
-                                    ("half after|past <hour-of-day>", -4.127134385045092),
-                                    ("time-of-day (latent)", -1.7600107709134747),
-                                    ("hhmm (latent)", -4.532599493153256),
-                                    ("hh:mm", -2.181224235989778),
-                                    ("quarter after|past <hour-of-day>", -4.532599493153256),
-                                    ("about|exactly <time-of-day>", -4.532599493153256),
-                                    ("until <time-of-day>", -3.8394523125933104),
-                                    ("hour", -1.2939210409888755),
-                                    ("<time-of-day> sharp|exactly", -4.532599493153256),
-                                    ("minute", -1.6422277352570913),
-                                    ("after <time-of-day>", -4.532599493153256)],
-                               n = 85},
-                   koData =
-                     ClassData{prior = -1.3689026184080213, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.20545280453606),
-                                    ("<hour-of-day> <integer>", -3.6109179126442243),
-                                    ("time-of-day (latent)", -1.0459685551826876),
-                                    ("hour", -1.0082282271998406), ("minute", -2.917770732084279),
-                                    ("after <time-of-day>", -3.6109179126442243)],
-                               n = 29}}),
-       ("Thanksgiving 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}}),
-       ("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.6286086594223742,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0149030205422647),
-                                    ("year (grain)", -2.70805020110221),
-                                    ("second", -2.70805020110221),
-                                    ("week (grain)", -2.0149030205422647),
-                                    ("day", -2.3025850929940455),
-                                    ("minute (grain)", -2.70805020110221),
-                                    ("year", -2.70805020110221),
-                                    ("second (grain) ", -2.70805020110221),
-                                    ("minute", -2.70805020110221),
-                                    ("day (grain)", -2.3025850929940455)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.7621400520468967, 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.406722127027582e-2,
-                               unseen = -4.02535169073515,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 54},
-                   koData =
-                     ClassData{prior = -2.9444389791664407,
-                               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
-                                   [("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.4769240720903093, unseen = -5.147494476813453,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.448516375942715),
-                                    ("dayhour", -3.1957534074473464),
-                                    ("daymonth", -3.1957534074473464),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.448516375942715),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.7553691953827695),
-                                    ("Wednesdayintersect", -4.448516375942715),
-                                    ("Labor Daythis|last|next <cycle>", -4.448516375942715),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.448516375942715),
-                                    ("<part-of-day> of <time>February", -4.448516375942715),
-                                    ("Saturday<time-of-day> am|pm", -4.448516375942715),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -4.448516375942715),
-                                    ("on <date><time-of-day> am|pm", -4.448516375942715),
-                                    ("hourmonth", -4.448516375942715),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.448516375942715),
-                                    ("dayday", -2.576714199041123),
-                                    ("the <day-of-month> (ordinal)February", -4.04305126783455),
-                                    ("WednesdayOctober", -4.448516375942715),
-                                    ("Wednesdaythis|last|next <cycle>", -4.04305126783455),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.5322256440685593),
-                                    ("dayyear", -2.9444389791664407),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.448516375942715),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.448516375942715),
-                                    ("Thursdayhh:mm", -4.04305126783455),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.448516375942715),
-                                    ("Memorial Daythis|last|next <cycle>", -4.448516375942715),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -4.04305126783455),
-                                    ("TuesdayOctober", -4.448516375942715),
-                                    ("the <day-of-month> (ordinal)March", -4.448516375942715),
-                                    ("Mondaythis|last|next <cycle>", -4.448516375942715),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.04305126783455),
-                                    ("Fridayintersect", -4.448516375942715),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.7553691953827695),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.5322256440685593),
-                                    ("Tuesdaythis|last|next <cycle>", -4.448516375942715),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.448516375942715),
-                                    ("dayminute", -2.6567569067146595),
-                                    ("intersectyear", -4.448516375942715),
-                                    ("minuteday", -3.5322256440685593),
-                                    ("this|last|next <cycle>Sunday", -4.448516375942715),
-                                    ("Sundaythis|last|next <cycle>", -4.448516375942715),
-                                    ("intersectintersect", -4.448516375942715),
-                                    ("weekday", -4.448516375942715),
-                                    ("dayweek", -3.349904087274605),
-                                    ("Thursday<time-of-day> am|pm", -4.448516375942715),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -4.04305126783455),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -4.04305126783455)],
-                               n = 54},
-                   koData =
-                     ClassData{prior = -0.9694005571881036, unseen = -4.867534450455582,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.1666652238017265),
-                                    ("week-endOctober", -3.4735180432417816),
-                                    ("daymonth", -1.9694406464655074),
-                                    ("TuesdaySeptember", -4.1666652238017265),
-                                    ("Wednesdayintersect", -4.1666652238017265),
-                                    ("hourmonth", -3.068052935133617),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.1666652238017265),
-                                    ("SundayFebruary", -4.1666652238017265),
-                                    ("WednesdayOctober", -4.1666652238017265),
-                                    ("week-endintersect", -4.1666652238017265),
-                                    ("FridayJuly", -3.7612001156935624),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.1666652238017265),
-                                    ("FridaySeptember", -4.1666652238017265),
-                                    ("WednesdayFebruary", -4.1666652238017265),
-                                    ("minutemonth", -3.250374491927572),
-                                    ("SundayMarch", -4.1666652238017265),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.1666652238017265),
-                                    ("MondayFebruary", -3.7612001156935624),
-                                    ("Fridayintersect", -4.1666652238017265),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.7612001156935624),
-                                    ("dayminute", -2.780370862681836),
-                                    ("SaturdaySeptember", -4.1666652238017265),
-                                    ("intersectSeptember", -3.250374491927572),
-                                    ("MondayMarch", -4.1666652238017265),
-                                    ("on <date>September", -3.7612001156935624),
-                                    ("intersectintersect", -4.1666652238017265),
-                                    ("Tuesdayintersect", -4.1666652238017265),
-                                    ("Sundayintersect", -4.1666652238017265)],
-                               n = 33}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.5649493574615367),
-                                    ("Martin Luther King's Day", -2.5649493574615367),
-                                    ("Memorial Day", -2.5649493574615367),
-                                    ("Mother's Day", -2.5649493574615367),
-                                    ("day", -1.3121863889661687), ("Sunday", -2.5649493574615367),
-                                    ("hour", -2.5649493574615367), ("Tuesday", -2.5649493574615367),
-                                    ("week-end", -2.5649493574615367)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.995732273553991),
-                                    ("Monday", -2.995732273553991), ("day", -2.0794415416798357),
-                                    ("Sunday", -2.995732273553991),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.742969305058623),
-                                    ("hour", -1.2909841813155656),
-                                    ("week-end", -1.8971199848858813)],
-                               n = 14}}),
-       ("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.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -1.9459101490553135),
-                                    ("Thursdayordinal (digits)", -2.3513752571634776),
-                                    ("day", -1.9459101490553135),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -1.9459101490553135),
-                                    ("Tuesdayordinal (digits)", -2.3513752571634776),
-                                    ("month", -1.252762968495368),
-                                    ("Marchordinal (digits)", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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.0986122886681098,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 1},
-                   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}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.3513752571634776),
-                                    ("a <unit-of-duration>Christmas", -2.3513752571634776),
-                                    ("<integer> <unit-of-duration>today", -2.3513752571634776),
-                                    ("secondsecond", -2.3513752571634776),
-                                    ("daysecond", -2.3513752571634776),
-                                    ("<integer> <unit-of-duration>Christmas", -2.3513752571634776),
-                                    ("yearday", -1.6582280766035324),
-                                    ("minutesecond", -2.3513752571634776),
-                                    ("<integer> <unit-of-duration>now", -1.9459101490553135)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("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}}),
-       ("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}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 21}}),
-       ("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.48550781578170077,
-                               unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.4733057381095205),
-                                    ("hh:mmhh:mm", -1.6739764335716716),
-                                    ("dayday", -2.772588722239781),
-                                    ("hourhour", -2.2617630984737906),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -2.772588722239781),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -2.772588722239781),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -3.1780538303479458),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm",
-                                     -2.4849066497880004)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.9555114450274363,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month> <day-of-month> (non ordinal)July",
-                                     -2.890371757896165),
-                                    ("daymonth", -2.4849066497880004),
-                                    ("<time-of-day> am|pmintersect", -2.890371757896165),
-                                    ("hh:mm<time-of-day> am|pm", -2.4849066497880004),
-                                    ("minuteminute", -1.9740810260220096),
-                                    ("hourhour", -2.4849066497880004),
-                                    ("minutehour", -2.4849066497880004),
-                                    ("hh:mmintersect", -1.9740810260220096),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -2.890371757896165),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -2.890371757896165)],
-                               n = 10}}),
-       ("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}}),
-       ("<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.8873031950009028,
-                               unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.5163474893680884),
-                                    ("hh:mmhh:mm", -1.5163474893680884),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.327277705584417),
-                                    ("hourhour", -1.7676619176489945),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.327277705584417)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -0.5306282510621704,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.2771447329921766),
-                                    ("hh:mmtime-of-day (latent)", -1.5723966407537513),
-                                    ("hh:mm<time-of-day> am|pm", -2.871679624884012),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -3.2771447329921766),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.2771447329921766),
-                                    ("hourhour", -2.0243817644968085),
-                                    ("minutehour", -1.262241712449912),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.2771447329921766),
-                                    ("at <time-of-day>time-of-day (latent)", -2.871679624884012),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -2.871679624884012)],
-                               n = 20}}),
-       ("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.2876820724517809,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5257286443082556),
-                                    ("Marchinteger (numeric)", -2.8134107167600364),
-                                    ("Aprilinteger (numeric)", -3.2188758248682006),
-                                    ("month", -0.8209805520698302),
-                                    ("Februaryinteger (numeric)", -1.9661128563728327),
-                                    ("Septemberinteger (numeric)", -2.8134107167600364),
-                                    ("Octoberinteger (numeric)", -2.8134107167600364),
-                                    ("Julyinteger (numeric)", -2.120263536200091)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Marchinteger (numeric)", -2.3978952727983707),
-                                    ("Aprilinteger (numeric)", -2.3978952727983707),
-                                    ("month", -1.0116009116784799),
-                                    ("Julyinteger (numeric)", -1.2992829841302609)],
-                               n = 7}}),
-       ("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.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
-                   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}}),
-       ("seasons",
-        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-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}}),
-       ("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}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.7047480922384253),
-                                    ("<time-of-day> am|pm", -1.7047480922384253),
-                                    ("hour", -1.2992829841302609)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.03688192726104),
-                                    ("tomorrow", -2.03688192726104), ("day", -1.3437347467010947),
-                                    ("time-of-day (latent)", -2.4423470353692043),
-                                    ("<time-of-day> am|pm", -2.4423470353692043),
-                                    ("Christmas", -2.03688192726104), ("hour", -1.749199854809259)],
-                               n = 8}}),
-       ("day (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}}),
-       ("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 = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("July", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               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}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.6026896854443837),
-                                    ("Martin Luther King's Day", -2.6026896854443837),
-                                    ("intersect", -2.6026896854443837),
-                                    ("Monday", -2.6026896854443837), ("day", -1.2163953243244932),
-                                    ("Thanksgiving Day", -2.6026896854443837),
-                                    ("hour", -2.1972245773362196), ("seasons", -1.9095425048844386),
-                                    ("week-end", -2.6026896854443837)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -2.3025850929940455,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.7047480922384253),
-                                    ("day", -1.7047480922384253)],
-                               n = 1}}),
-       ("August",
-        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}})]
diff --git a/Duckling/Ranking/Classifiers/EN_CA.hs b/Duckling/Ranking/Classifiers/EN_CA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/EN_CA.hs
@@ -0,0 +1,2349 @@
+-- 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.EN_CA (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+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 = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hh:mm", -1.7047480922384253), ("hour", -1.2992829841302609),
+                                    ("minute", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.7740538191727457, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178},
+                   koData =
+                     ClassData{prior = -0.6182992897635128,
+                               unseen = -5.3471075307174685,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 208}}),
+       ("<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.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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 = -0.10536051565782628,
+                               unseen = -4.787491742782046,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -3.6805112044434196),
+                                    ("integer after|past <hour-of-day>", -3.6805112044434196),
+                                    ("half after|past <hour-of-day>", -4.085976312551584),
+                                    ("time-of-day (latent)", -1.7346010553881064),
+                                    ("hhmm (latent)", -3.392829131991639),
+                                    ("<time-of-day> am|pm", -1.7833912195575383),
+                                    ("hh:mm", -3.169685580677429),
+                                    ("about|exactly <time-of-day>", -3.6805112044434196),
+                                    ("hour", -1.1415373333851437),
+                                    ("<time-of-day> sharp|exactly", -4.085976312551584),
+                                    ("minute", -1.8887517352153647)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.1895840668738362),
+                                    ("hour", -1.1895840668738362)],
+                               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}}),
+       ("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 = -2.409755157906053e-2,
+                               unseen = -3.7612001156935624,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 41},
+                   koData =
+                     ClassData{prior = -3.7376696182833684,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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 = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.3364722366212129),
+                                    ("integer (0..19)integer (20..90)", -1.252762968495368)],
+                               n = 5}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4634795031687923, unseen = -6.169610732491456,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<datetime> - <datetime> (interval)on <date>",
+                                     -4.558078578454241),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.558078578454241),
+                                    ("hourday", -3.769621218089971),
+                                    ("dayhour", -3.223077511721901),
+                                    ("daymonth", -4.781222129768451),
+                                    ("monthday", -5.0689042022202315),
+                                    ("monthyear", -3.8649313978942956),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.474369310328396),
+                                    ("Christmasyear", -5.474369310328396),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.474369310328396),
+                                    ("houryear", -5.474369310328396),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -5.474369310328396),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.781222129768451),
+                                    ("<time-of-day> am|pmintersect", -4.221606341833028),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -5.474369310328396),
+                                    ("Marchyear", -5.474369310328396),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
+                                     -5.0689042022202315),
+                                    ("intersect<time-of-day> am|pm", -5.474369310328396),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.474369310328396),
+                                    ("monthhour", -5.0689042022202315),
+                                    ("last <day-of-week> of <time>year", -5.474369310328396),
+                                    ("todayat <time-of-day>", -5.474369310328396),
+                                    ("Thursday<time> timezone", -5.0689042022202315),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -5.474369310328396),
+                                    ("dayday", -3.459466289786131),
+                                    ("Thanksgiving Dayyear", -4.375757021660286),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.474369310328396),
+                                    ("Tuesdayin <named-month>", -5.474369310328396),
+                                    ("mm/ddat <time-of-day>", -5.474369310328396),
+                                    ("tonightat <time-of-day>", -5.474369310328396),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -4.781222129768451),
+                                    ("today<time-of-day> am|pm", -5.474369310328396),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.0689042022202315),
+                                    ("at <time-of-day><time> <part-of-day>", -5.474369310328396),
+                                    ("mm/dd<time-of-day> am|pm", -5.474369310328396),
+                                    ("hourhour", -4.221606341833028),
+                                    ("<time-of-day> am|pmon <date>", -3.459466289786131),
+                                    ("Wednesdaythis|last|next <cycle>", -5.474369310328396),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.970291913552122),
+                                    ("dayyear", -3.0320222749591914),
+                                    ("last weekend of <named-month>year", -5.474369310328396),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("<time-of-day> am|pmtomorrow", -4.781222129768451),
+                                    ("minutehour", -4.558078578454241),
+                                    ("Mother's Dayyear", -5.474369310328396),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.0689042022202315),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -3.769621218089971),
+                                    ("for <duration> from <time>December", -5.474369310328396),
+                                    ("tomorrow<time-of-day> sharp|exactly", -5.474369310328396),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.558078578454241),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.0689042022202315),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.558078578454241),
+                                    ("Mondayin|during the <part-of-day>", -5.474369310328396),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.0689042022202315),
+                                    ("intersectin|during the <part-of-day>", -5.474369310328396),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.781222129768451),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -4.558078578454241),
+                                    ("at <time-of-day>intersect", -5.0689042022202315),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -5.474369310328396),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.474369310328396),
+                                    ("dayminute", -3.1717842173343502),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.0689042022202315),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -5.474369310328396),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.0689042022202315),
+                                    ("<ordinal> <cycle> of <time>year", -5.474369310328396),
+                                    ("minuteday", -2.0731719286662407),
+                                    ("absorption of , after named dayintersect",
+                                     -5.474369310328396),
+                                    ("Octoberyear", -4.221606341833028),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -5.474369310328396),
+                                    ("<day-of-month> (ordinal or number) <named-month>year",
+                                     -5.474369310328396),
+                                    ("year<time-of-day> am|pm", -5.474369310328396),
+                                    ("Septemberyear", -5.0689042022202315),
+                                    ("at <time-of-day>on <date>", -4.375757021660286),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.781222129768451),
+                                    ("Halloweenyear", -5.474369310328396),
+                                    ("dayweek", -5.474369310328396),
+                                    ("weekyear", -5.0689042022202315),
+                                    ("hh:mmin|during the <part-of-day>", -4.781222129768451),
+                                    ("Father's Dayyear", -5.474369310328396),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.0689042022202315),
+                                    ("February<time> <part-of-day>", -5.474369310328396),
+                                    ("Martin Luther King's Dayyear", -5.0689042022202315),
+                                    ("tomorrowat <time-of-day>", -4.781222129768451),
+                                    ("between <time> and <time>on <date>", -4.781222129768451),
+                                    ("at <time-of-day>tomorrow", -5.0689042022202315),
+                                    ("tomorrow<time-of-day> am|pm", -5.474369310328396),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -5.474369310328396),
+                                    ("black fridayyear", -5.0689042022202315),
+                                    ("Labor Dayyear", -5.474369310328396),
+                                    ("Februaryintersect", -5.474369310328396),
+                                    ("last <cycle> of <time>year", -4.781222129768451),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -5.474369310328396),
+                                    ("yearminute", -5.474369310328396)],
+                               n = 173},
+                   koData =
+                     ClassData{prior = -0.9917982843823002, unseen = -5.817111159963204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("in <named-month>year", -5.120983351265121),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.120983351265121),
+                                    ("hourday", -5.120983351265121),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.120983351265121),
+                                    ("dayhour", -3.329223882037066),
+                                    ("daymonth", -3.041541809585285),
+                                    ("monthday", -4.715518243156957),
+                                    ("monthyear", -4.427836170705175),
+                                    ("intersecthh:mm", -5.120983351265121),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.120983351265121),
+                                    ("houryear", -5.120983351265121),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.120983351265121),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.120983351265121),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.427836170705175),
+                                    ("<time-of-day> am|pmintersect", -3.868220382769753),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -4.204692619390966),
+                                    ("Tuesdayafter <time-of-day>", -5.120983351265121),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.120983351265121),
+                                    ("absorption of , after named dayJuly", -4.715518243156957),
+                                    ("monthhour", -5.120983351265121),
+                                    ("hourmonth", -4.427836170705175),
+                                    ("todayat <time-of-day>", -5.120983351265121),
+                                    ("dayday", -4.715518243156957),
+                                    ("mm/ddat <time-of-day>", -4.715518243156957),
+                                    ("<time-of-day> am|pmon <date>", -3.868220382769753),
+                                    ("dayyear", -3.868220382769753),
+                                    ("Thursdaymm/dd", -5.120983351265121),
+                                    ("Thursdayat <time-of-day>", -5.120983351265121),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.120983351265121),
+                                    ("monthminute", -5.120983351265121),
+                                    ("<time-of-day> am|pmtomorrow", -5.120983351265121),
+                                    ("Thursdayhh:mm", -5.120983351265121),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.120983351265121),
+                                    ("Fridayyear", -4.715518243156957),
+                                    ("minutemonth", -3.416235259026696),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.715518243156957),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("Aprilyear", -5.120983351265121),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.120983351265121),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.120983351265121),
+                                    ("yesterday<time-of-day> am|pm", -5.120983351265121),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.204692619390966),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.120983351265121),
+                                    ("until <time-of-day>on <date>", -4.427836170705175),
+                                    ("at <time-of-day>intersect", -4.715518243156957),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.120983351265121),
+                                    ("dayminute", -3.175073202209808),
+                                    ("intersectSeptember", -3.616905954488847),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.120983351265121),
+                                    ("minuteday", -2.317622970358586),
+                                    ("absorption of , after named dayintersect",
+                                     -5.120983351265121),
+                                    ("Februaryin|during the <part-of-day>", -5.120983351265121),
+                                    ("week-endin <named-month>", -5.120983351265121),
+                                    ("Octoberyear", -5.120983351265121),
+                                    ("yearhh:mm", -5.120983351265121),
+                                    ("hh:mmon <date>", -3.616905954488847),
+                                    ("absorption of , after named daySeptember",
+                                     -4.204692619390966),
+                                    ("on <date>September", -4.715518243156957),
+                                    ("at <time-of-day>on <date>", -4.715518243156957),
+                                    ("absorption of , after named dayFebruary", -4.204692619390966),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.120983351265121),
+                                    ("tomorrowat <time-of-day>", -5.120983351265121),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.120983351265121),
+                                    ("tomorrow<time-of-day> am|pm", -5.120983351265121),
+                                    ("after <time-of-day><time-of-day> am|pm", -5.120983351265121),
+                                    ("after <time-of-day>year", -5.120983351265121),
+                                    ("yearminute", -5.120983351265121)],
+                               n = 102}}),
+       ("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.041453874828161, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.5596157879354228),
+                                    ("integer (0..19)", -0.8472978603872037)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.4353180712578455,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3448404862917295),
+                                    ("integer (0..19)", -1.2321436812926323)],
+                               n = 22}}),
+       ("<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 = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
+                               n = 2}}),
+       ("last|next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.430816798843313,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.627081138568543),
+                                    ("integer (0..19)year (grain)", -3.3202283191284883),
+                                    ("integer (numeric)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)second (grain) ", -3.3202283191284883),
+                                    ("integer (0..19)hour (grain)", -3.3202283191284883),
+                                    ("second", -2.8094026953624978),
+                                    ("integer (numeric)second (grain) ", -3.3202283191284883),
+                                    ("integer (numeric)year (grain)", -3.3202283191284883),
+                                    ("day", -2.472930458741285), ("year", -2.8094026953624978),
+                                    ("integer (numeric)week (grain)", -3.0325462466767075),
+                                    ("integer (0..19)month (grain)", -3.3202283191284883),
+                                    ("hour", -2.8094026953624978), ("month", -2.8094026953624978),
+                                    ("integer (numeric)minute (grain)", -3.3202283191284883),
+                                    ("integer (0..19)minute (grain)", -3.3202283191284883),
+                                    ("integer (numeric)month (grain)", -3.3202283191284883),
+                                    ("minute", -2.8094026953624978),
+                                    ("integer (numeric)hour (grain)", -3.3202283191284883),
+                                    ("integer (0..19)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)week (grain)", -3.3202283191284883)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               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}}),
+       ("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}}),
+       ("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.5363047090669756, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1158318155251217),
+                                    ("integer (0..19)", -2.2129729343043585)],
+                               n = 62},
+                   koData =
+                     ClassData{prior = -0.8792494601938059,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -2.197890671877523e-2)],
+                               n = 44}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.2113090936672069, unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -1.6582280766035324,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8}}),
+       ("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.7444404749474959, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -3.2088254890146994),
+                                    ("integer (numeric)day (grain)", -2.515678308454754),
+                                    ("integer (0..19)second (grain) ", -3.9019726695746444),
+                                    ("integer (0..19)hour (grain)", -2.803360380906535),
+                                    ("second", -3.9019726695746444),
+                                    ("integer (numeric)year (grain)", -3.9019726695746444),
+                                    ("day", -2.515678308454754), ("year", -2.9856819377004897),
+                                    ("integer (numeric)week (grain)", -2.9856819377004897),
+                                    ("integer (0..19)month (grain)", -3.4965075614664802),
+                                    ("hour", -2.515678308454754), ("month", -3.4965075614664802),
+                                    ("integer (numeric)minute (grain)", -2.9856819377004897),
+                                    ("integer (0..19)minute (grain)", -2.803360380906535),
+                                    ("minute", -2.2925347571405443),
+                                    ("integer (numeric)hour (grain)", -3.4965075614664802),
+                                    ("integer (0..19)week (grain)", -2.9856819377004897)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -0.6443570163905132, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.8810693652338513),
+                                    ("integer (0..19)year (grain)", -3.5742165457937967),
+                                    ("integer (numeric)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)second (grain) ", -3.5742165457937967),
+                                    ("integer (0..19)hour (grain)", -3.5742165457937967),
+                                    ("second", -3.0633909220278057),
+                                    ("integer (numeric)second (grain) ", -3.5742165457937967),
+                                    ("integer (numeric)year (grain)", -3.5742165457937967),
+                                    ("day", -2.7269186854065928), ("quarter", -3.979681653901961),
+                                    ("year", -3.0633909220278057),
+                                    ("integer (numeric)week (grain)", -3.2865344733420154),
+                                    ("integer (0..19)month (grain)", -3.5742165457937967),
+                                    ("hour", -1.9647786333596962), ("month", -3.0633909220278057),
+                                    ("integer (numeric)minute (grain)", -3.5742165457937967),
+                                    ("integer (0..19)minute (grain)", -3.5742165457937967),
+                                    ("integer (numeric)month (grain)", -3.5742165457937967),
+                                    ("minute", -3.0633909220278057),
+                                    ("integer (numeric)hour (grain)", -2.1078794770003695),
+                                    ("integer (0..19)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)week (grain)", -3.5742165457937967),
+                                    ("integer (0..19)quarter (grain)", -3.979681653901961)],
+                               n = 42}}),
+       ("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.2847365622220242, unseen = -5.231108616854587,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.8394523125933104),
+                                    ("at <time-of-day>", -2.2300144001592104),
+                                    ("<time-of-day> o'clock", -4.127134385045092),
+                                    ("half after|past <hour-of-day>", -4.127134385045092),
+                                    ("time-of-day (latent)", -1.7600107709134747),
+                                    ("hhmm (latent)", -4.532599493153256),
+                                    ("hh:mm", -2.181224235989778),
+                                    ("quarter after|past <hour-of-day>", -4.532599493153256),
+                                    ("about|exactly <time-of-day>", -4.532599493153256),
+                                    ("until <time-of-day>", -3.8394523125933104),
+                                    ("hour", -1.2939210409888755),
+                                    ("<time-of-day> sharp|exactly", -4.532599493153256),
+                                    ("minute", -1.6422277352570913),
+                                    ("after <time-of-day>", -4.532599493153256)],
+                               n = 85},
+                   koData =
+                     ClassData{prior = -1.3951833085371366, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.1780538303479458),
+                                    ("<hour-of-day> <integer>", -3.58351893845611),
+                                    ("time-of-day (latent)", -1.0577902941478545),
+                                    ("hour", -1.0185695809945732), ("minute", -2.890371757896165),
+                                    ("after <time-of-day>", -3.58351893845611)],
+                               n = 28}}),
+       ("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.406722127027582e-2,
+                               unseen = -4.02535169073515,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 54},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               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
+                                   [("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 = -1.0116009116784799,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.6741486494265287),
+                                    ("Martin Luther King's Day", -2.6741486494265287),
+                                    ("Memorial Day", -2.6741486494265287),
+                                    ("Mother's Day", -2.6741486494265287),
+                                    ("day", -1.2878542883066382), ("Sunday", -2.6741486494265287),
+                                    ("Thanksgiving Day", -2.6741486494265287),
+                                    ("hour", -2.6741486494265287), ("Tuesday", -2.6741486494265287),
+                                    ("week-end", -2.6741486494265287)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -3.0204248861443626),
+                                    ("Monday", -3.0204248861443626), ("day", -2.1041341542702074),
+                                    ("Sunday", -3.0204248861443626),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.7676619176489945),
+                                    ("hour", -1.3156767939059373),
+                                    ("week-end", -1.9218125974762528)],
+                               n = 14}}),
+       ("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.11778303565638351,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0794415416798357),
+                                    ("Thursdayordinal (digits)", -2.4849066497880004),
+                                    ("day", -2.0794415416798357),
+                                    ("Augustordinal (digits)", -2.4849066497880004),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.0794415416798357),
+                                    ("Tuesdayordinal (digits)", -2.4849066497880004),
+                                    ("month", -1.2321436812926323),
+                                    ("Marchordinal (digits)", -2.4849066497880004)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustordinal (digits)", -1.6094379124341003),
+                                    ("month", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("<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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 24}}),
+       ("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.48550781578170077,
+                               unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.4733057381095205),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("dayday", -2.772588722239781),
+                                    ("hourhour", -2.2617630984737906),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.1780538303479458),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.4849066497880004)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.9555114450274363,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -2.890371757896165),
+                                    ("daymonth", -2.4849066497880004),
+                                    ("<time-of-day> am|pmintersect", -2.890371757896165),
+                                    ("hh:mm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("minuteminute", -1.9740810260220096),
+                                    ("hourhour", -2.4849066497880004),
+                                    ("minutehour", -2.4849066497880004),
+                                    ("hh:mmintersect", -1.9740810260220096),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -2.890371757896165),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -2.890371757896165)],
+                               n = 10}}),
+       ("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}}),
+       ("<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.8873031950009028,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.5163474893680884),
+                                    ("hh:mmhh:mm", -1.5163474893680884),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.327277705584417),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.327277705584417)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("hh:mmtime-of-day (latent)", -1.5723966407537513),
+                                    ("hh:mm<time-of-day> am|pm", -2.871679624884012),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.2771447329921766),
+                                    ("hourhour", -2.0243817644968085),
+                                    ("minutehour", -1.262241712449912),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day>time-of-day (latent)", -2.871679624884012),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -2.871679624884012)],
+                               n = 20}}),
+       ("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.35667494393873245,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5257286443082556),
+                                    ("Marchinteger (numeric)", -2.8134107167600364),
+                                    ("Aprilinteger (numeric)", -3.2188758248682006),
+                                    ("month", -0.8209805520698302),
+                                    ("Februaryinteger (numeric)", -1.9661128563728327),
+                                    ("Septemberinteger (numeric)", -2.8134107167600364),
+                                    ("Octoberinteger (numeric)", -2.8134107167600364),
+                                    ("Julyinteger (numeric)", -2.120263536200091)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.2039728043259361, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.159484249353372),
+                                    ("Marchinteger (numeric)", -2.5649493574615367),
+                                    ("Aprilinteger (numeric)", -2.5649493574615367),
+                                    ("month", -0.9555114450274363),
+                                    ("Julyinteger (numeric)", -1.466337068793427)],
+                               n = 9}}),
+       ("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}}),
+       ("seasons",
+        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-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}}),
+       ("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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hour", -1.2992829841302609)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.03688192726104),
+                                    ("tomorrow", -2.03688192726104), ("day", -1.3437347467010947),
+                                    ("time-of-day (latent)", -2.4423470353692043),
+                                    ("<time-of-day> am|pm", -2.4423470353692043),
+                                    ("Christmas", -2.03688192726104), ("hour", -1.749199854809259)],
+                               n = 8}}),
+       ("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}}),
+       ("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}}),
+       ("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.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.2992829841302609),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.9924301646902063),
+                                    ("month", -0.7884573603642702),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("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.10536051565782628,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.6026896854443837),
+                                    ("Martin Luther King's Day", -2.6026896854443837),
+                                    ("intersect", -2.6026896854443837),
+                                    ("Monday", -2.6026896854443837), ("day", -1.2163953243244932),
+                                    ("Thanksgiving Day", -2.6026896854443837),
+                                    ("hour", -2.1972245773362196), ("seasons", -1.9095425048844386),
+                                    ("week-end", -2.6026896854443837)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7047480922384253),
+                                    ("day", -1.7047480922384253)],
+                               n = 1}}),
+       ("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}})]
diff --git a/Duckling/Ranking/Classifiers/EN_GB.hs b/Duckling/Ranking/Classifiers/EN_GB.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/EN_GB.hs
@@ -0,0 +1,2345 @@
+-- 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.EN_GB (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+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 = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hh:mm", -1.7047480922384253), ("hour", -1.2992829841302609),
+                                    ("minute", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.7740538191727457, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178},
+                   koData =
+                     ClassData{prior = -0.6182992897635128,
+                               unseen = -5.3471075307174685,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 208}}),
+       ("<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.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("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.3437347467010947,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.3022808718729337,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
+       ("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 = -0.10536051565782628,
+                               unseen = -4.787491742782046,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -3.6805112044434196),
+                                    ("integer after|past <hour-of-day>", -3.6805112044434196),
+                                    ("half after|past <hour-of-day>", -4.085976312551584),
+                                    ("time-of-day (latent)", -1.7346010553881064),
+                                    ("hhmm (latent)", -3.392829131991639),
+                                    ("<time-of-day> am|pm", -1.7833912195575383),
+                                    ("hh:mm", -3.169685580677429),
+                                    ("about|exactly <time-of-day>", -3.6805112044434196),
+                                    ("hour", -1.1415373333851437),
+                                    ("<time-of-day> sharp|exactly", -4.085976312551584),
+                                    ("minute", -1.8887517352153647)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.1895840668738362),
+                                    ("hour", -1.1895840668738362)],
+                               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}}),
+       ("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 = -2.409755157906053e-2,
+                               unseen = -3.7612001156935624,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 41},
+                   koData =
+                     ClassData{prior = -3.7376696182833684,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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 = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.5108256237659907),
+                                    ("integer (0..19)integer (20..90)", -0.916290731874155)],
+                               n = 3}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.45983651189029134,
+                               unseen = -6.1675164908883415,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<datetime> - <datetime> (interval)on <date>",
+                                     -4.55597994179732),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.55597994179732),
+                                    ("hourday", -3.7675225814330493),
+                                    ("dayhour", -3.2209788750649797),
+                                    ("daymonth", -4.77912349311153),
+                                    ("monthday", -5.06680556556331),
+                                    ("monthyear", -3.862832761237374),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.472270673671475),
+                                    ("Christmasyear", -5.472270673671475),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.472270673671475),
+                                    ("houryear", -5.472270673671475),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -5.472270673671475),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.77912349311153),
+                                    ("<time-of-day> am|pmintersect", -4.219507705176107),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -5.472270673671475),
+                                    ("Marchyear", -5.472270673671475),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
+                                     -5.06680556556331),
+                                    ("intersect<time-of-day> am|pm", -5.472270673671475),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.472270673671475),
+                                    ("monthhour", -5.06680556556331),
+                                    ("last <day-of-week> of <time>year", -5.472270673671475),
+                                    ("todayat <time-of-day>", -5.472270673671475),
+                                    ("Thursday<time> timezone", -5.06680556556331),
+                                    ("dd/mm<time-of-day> am|pm", -5.472270673671475),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -5.472270673671475),
+                                    ("dayday", -3.45736765312921),
+                                    ("Thanksgiving Dayyear", -4.373658385003365),
+                                    ("dd/mmat <time-of-day>", -5.472270673671475),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.472270673671475),
+                                    ("Tuesdayin <named-month>", -5.472270673671475),
+                                    ("tonightat <time-of-day>", -5.472270673671475),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -4.77912349311153),
+                                    ("today<time-of-day> am|pm", -5.472270673671475),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.06680556556331),
+                                    ("at <time-of-day><time> <part-of-day>", -5.472270673671475),
+                                    ("hourhour", -4.219507705176107),
+                                    ("<time-of-day> am|pmon <date>", -3.45736765312921),
+                                    ("Wednesdaythis|last|next <cycle>", -5.472270673671475),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.968193276895201),
+                                    ("dayyear", -3.0299236383022703),
+                                    ("last weekend of <named-month>year", -5.472270673671475),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -5.472270673671475),
+                                    ("<time-of-day> am|pmtomorrow", -4.77912349311153),
+                                    ("minutehour", -4.55597994179732),
+                                    ("Mother's Dayyear", -5.472270673671475),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.06680556556331),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -3.7675225814330493),
+                                    ("for <duration> from <time>December", -5.472270673671475),
+                                    ("tomorrow<time-of-day> sharp|exactly", -5.472270673671475),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.55597994179732),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.06680556556331),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.55597994179732),
+                                    ("Mondayin|during the <part-of-day>", -5.472270673671475),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.06680556556331),
+                                    ("intersectin|during the <part-of-day>", -5.472270673671475),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -5.472270673671475),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.77912349311153),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -4.55597994179732),
+                                    ("at <time-of-day>intersect", -5.06680556556331),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -5.472270673671475),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.472270673671475),
+                                    ("dayminute", -3.169685580677429),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.06680556556331),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -5.472270673671475),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.06680556556331),
+                                    ("<ordinal> <cycle> of <time>year", -5.472270673671475),
+                                    ("minuteday", -2.0710732920093196),
+                                    ("absorption of , after named dayintersect",
+                                     -5.472270673671475),
+                                    ("Octoberyear", -4.219507705176107),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -5.472270673671475),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -5.472270673671475),
+                                    ("<day-of-month> (ordinal or number) <named-month>year",
+                                     -5.472270673671475),
+                                    ("year<time-of-day> am|pm", -5.472270673671475),
+                                    ("Septemberyear", -5.06680556556331),
+                                    ("at <time-of-day>on <date>", -4.373658385003365),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.77912349311153),
+                                    ("Halloweenyear", -5.472270673671475),
+                                    ("dayweek", -5.472270673671475),
+                                    ("weekyear", -5.06680556556331),
+                                    ("hh:mmin|during the <part-of-day>", -4.77912349311153),
+                                    ("Father's Dayyear", -5.472270673671475),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.06680556556331),
+                                    ("February<time> <part-of-day>", -5.472270673671475),
+                                    ("Martin Luther King's Dayyear", -5.06680556556331),
+                                    ("tomorrowat <time-of-day>", -4.77912349311153),
+                                    ("between <time> and <time>on <date>", -4.77912349311153),
+                                    ("at <time-of-day>tomorrow", -5.06680556556331),
+                                    ("tomorrow<time-of-day> am|pm", -5.472270673671475),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -5.472270673671475),
+                                    ("black fridayyear", -5.06680556556331),
+                                    ("Labor Dayyear", -5.472270673671475),
+                                    ("Februaryintersect", -5.472270673671475),
+                                    ("last <cycle> of <time>year", -4.77912349311153),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -5.472270673671475),
+                                    ("yearminute", -5.472270673671475)],
+                               n = 173},
+                   koData =
+                     ClassData{prior = -0.9980075895468108, unseen = -5.808142489980444,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("in <named-month>year", -5.111987788356543),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.111987788356543),
+                                    ("hourday", -5.111987788356543),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.111987788356543),
+                                    ("dayhour", -3.3202283191284883),
+                                    ("daymonth", -3.0325462466767075),
+                                    ("monthday", -4.706522680248379),
+                                    ("monthyear", -4.418840607796598),
+                                    ("intersecthh:mm", -5.111987788356543),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.111987788356543),
+                                    ("houryear", -5.111987788356543),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.111987788356543),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.111987788356543),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.418840607796598),
+                                    ("<time-of-day> am|pmintersect", -3.859224819861175),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -4.1956970564823886),
+                                    ("Tuesdayafter <time-of-day>", -5.111987788356543),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.111987788356543),
+                                    ("absorption of , after named dayJuly", -4.706522680248379),
+                                    ("monthhour", -5.111987788356543),
+                                    ("hourmonth", -4.418840607796598),
+                                    ("todayat <time-of-day>", -5.111987788356543),
+                                    ("dayday", -5.111987788356543),
+                                    ("dd/mmat <time-of-day>", -4.706522680248379),
+                                    ("<time-of-day> am|pmon <date>", -3.859224819861175),
+                                    ("dayyear", -3.859224819861175),
+                                    ("Thursdayat <time-of-day>", -5.111987788356543),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.111987788356543),
+                                    ("monthminute", -5.111987788356543),
+                                    ("<time-of-day> am|pmtomorrow", -5.111987788356543),
+                                    ("Thursdayhh:mm", -5.111987788356543),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.111987788356543),
+                                    ("Fridayyear", -4.706522680248379),
+                                    ("minutemonth", -3.407239696118118),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.706522680248379),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.706522680248379),
+                                    ("Aprilyear", -5.111987788356543),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.111987788356543),
+                                    ("dd/mm<time-of-day> - <time-of-day> (interval)",
+                                     -4.706522680248379),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.111987788356543),
+                                    ("yesterday<time-of-day> am|pm", -5.111987788356543),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.1956970564823886),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.111987788356543),
+                                    ("until <time-of-day>on <date>", -4.418840607796598),
+                                    ("at <time-of-day>intersect", -4.706522680248379),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.111987788356543),
+                                    ("dayminute", -3.16607763930123),
+                                    ("intersectSeptember", -3.607910391580269),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.111987788356543),
+                                    ("minuteday", -2.3086274074500084),
+                                    ("absorption of , after named dayintersect",
+                                     -5.111987788356543),
+                                    ("Februaryin|during the <part-of-day>", -5.111987788356543),
+                                    ("week-endin <named-month>", -5.111987788356543),
+                                    ("Octoberyear", -5.111987788356543),
+                                    ("yearhh:mm", -5.111987788356543),
+                                    ("hh:mmon <date>", -3.607910391580269),
+                                    ("absorption of , after named daySeptember",
+                                     -4.1956970564823886),
+                                    ("on <date>September", -4.706522680248379),
+                                    ("at <time-of-day>on <date>", -4.706522680248379),
+                                    ("absorption of , after named dayFebruary",
+                                     -4.1956970564823886),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.111987788356543),
+                                    ("tomorrowat <time-of-day>", -5.111987788356543),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.111987788356543),
+                                    ("tomorrow<time-of-day> am|pm", -5.111987788356543),
+                                    ("after <time-of-day><time-of-day> am|pm", -5.111987788356543),
+                                    ("after <time-of-day>year", -5.111987788356543),
+                                    ("yearminute", -5.111987788356543)],
+                               n = 101}}),
+       ("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.041453874828161, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.5596157879354228),
+                                    ("integer (0..19)", -0.8472978603872037)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.4353180712578455,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3448404862917295),
+                                    ("integer (0..19)", -1.2321436812926323)],
+                               n = 22}}),
+       ("<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 = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
+                               n = 2}}),
+       ("last|next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.430816798843313,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.627081138568543),
+                                    ("integer (0..19)year (grain)", -3.3202283191284883),
+                                    ("integer (numeric)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)second (grain) ", -3.3202283191284883),
+                                    ("integer (0..19)hour (grain)", -3.3202283191284883),
+                                    ("second", -2.8094026953624978),
+                                    ("integer (numeric)second (grain) ", -3.3202283191284883),
+                                    ("integer (numeric)year (grain)", -3.3202283191284883),
+                                    ("day", -2.472930458741285), ("year", -2.8094026953624978),
+                                    ("integer (numeric)week (grain)", -3.0325462466767075),
+                                    ("integer (0..19)month (grain)", -3.3202283191284883),
+                                    ("hour", -2.8094026953624978), ("month", -2.8094026953624978),
+                                    ("integer (numeric)minute (grain)", -3.3202283191284883),
+                                    ("integer (0..19)minute (grain)", -3.3202283191284883),
+                                    ("integer (numeric)month (grain)", -3.3202283191284883),
+                                    ("minute", -2.8094026953624978),
+                                    ("integer (numeric)hour (grain)", -3.3202283191284883),
+                                    ("integer (0..19)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)week (grain)", -3.3202283191284883)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               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}}),
+       ("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 = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   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}}),
+       ("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.5363047090669756, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1158318155251217),
+                                    ("integer (0..19)", -2.2129729343043585)],
+                               n = 62},
+                   koData =
+                     ClassData{prior = -0.8792494601938059,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -2.197890671877523e-2)],
+                               n = 44}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.2113090936672069, unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -1.6582280766035324,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8}}),
+       ("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.7444404749474959, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -3.2088254890146994),
+                                    ("integer (numeric)day (grain)", -2.515678308454754),
+                                    ("integer (0..19)second (grain) ", -3.9019726695746444),
+                                    ("integer (0..19)hour (grain)", -2.803360380906535),
+                                    ("second", -3.9019726695746444),
+                                    ("integer (numeric)year (grain)", -3.9019726695746444),
+                                    ("day", -2.515678308454754), ("year", -2.9856819377004897),
+                                    ("integer (numeric)week (grain)", -2.9856819377004897),
+                                    ("integer (0..19)month (grain)", -3.4965075614664802),
+                                    ("hour", -2.515678308454754), ("month", -3.4965075614664802),
+                                    ("integer (numeric)minute (grain)", -2.9856819377004897),
+                                    ("integer (0..19)minute (grain)", -2.803360380906535),
+                                    ("minute", -2.2925347571405443),
+                                    ("integer (numeric)hour (grain)", -3.4965075614664802),
+                                    ("integer (0..19)week (grain)", -2.9856819377004897)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -0.6443570163905132, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.8810693652338513),
+                                    ("integer (0..19)year (grain)", -3.5742165457937967),
+                                    ("integer (numeric)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)second (grain) ", -3.5742165457937967),
+                                    ("integer (0..19)hour (grain)", -3.5742165457937967),
+                                    ("second", -3.0633909220278057),
+                                    ("integer (numeric)second (grain) ", -3.5742165457937967),
+                                    ("integer (numeric)year (grain)", -3.5742165457937967),
+                                    ("day", -2.7269186854065928), ("quarter", -3.979681653901961),
+                                    ("year", -3.0633909220278057),
+                                    ("integer (numeric)week (grain)", -3.2865344733420154),
+                                    ("integer (0..19)month (grain)", -3.5742165457937967),
+                                    ("hour", -1.9647786333596962), ("month", -3.0633909220278057),
+                                    ("integer (numeric)minute (grain)", -3.5742165457937967),
+                                    ("integer (0..19)minute (grain)", -3.5742165457937967),
+                                    ("integer (numeric)month (grain)", -3.5742165457937967),
+                                    ("minute", -3.0633909220278057),
+                                    ("integer (numeric)hour (grain)", -2.1078794770003695),
+                                    ("integer (0..19)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)week (grain)", -3.5742165457937967),
+                                    ("integer (0..19)quarter (grain)", -3.979681653901961)],
+                               n = 42}}),
+       ("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.2847365622220242, unseen = -5.231108616854587,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.8394523125933104),
+                                    ("at <time-of-day>", -2.2300144001592104),
+                                    ("<time-of-day> o'clock", -4.127134385045092),
+                                    ("half after|past <hour-of-day>", -4.127134385045092),
+                                    ("time-of-day (latent)", -1.7600107709134747),
+                                    ("hhmm (latent)", -4.532599493153256),
+                                    ("hh:mm", -2.181224235989778),
+                                    ("quarter after|past <hour-of-day>", -4.532599493153256),
+                                    ("about|exactly <time-of-day>", -4.532599493153256),
+                                    ("until <time-of-day>", -3.8394523125933104),
+                                    ("hour", -1.2939210409888755),
+                                    ("<time-of-day> sharp|exactly", -4.532599493153256),
+                                    ("minute", -1.6422277352570913),
+                                    ("after <time-of-day>", -4.532599493153256)],
+                               n = 85},
+                   koData =
+                     ClassData{prior = -1.3951833085371366, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.1780538303479458),
+                                    ("<hour-of-day> <integer>", -3.58351893845611),
+                                    ("time-of-day (latent)", -1.0577902941478545),
+                                    ("hour", -1.0185695809945732), ("minute", -2.890371757896165),
+                                    ("after <time-of-day>", -3.58351893845611)],
+                               n = 28}}),
+       ("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.406722127027582e-2,
+                               unseen = -4.02535169073515,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 54},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               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 = -1.0116009116784799,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.6741486494265287),
+                                    ("Martin Luther King's Day", -2.6741486494265287),
+                                    ("Memorial Day", -2.6741486494265287),
+                                    ("Mother's Day", -2.6741486494265287),
+                                    ("day", -1.2878542883066382), ("Sunday", -2.6741486494265287),
+                                    ("Thanksgiving Day", -2.6741486494265287),
+                                    ("hour", -2.6741486494265287), ("Tuesday", -2.6741486494265287),
+                                    ("week-end", -2.6741486494265287)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -3.0204248861443626),
+                                    ("Monday", -3.0204248861443626), ("day", -2.1041341542702074),
+                                    ("Sunday", -3.0204248861443626),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.7676619176489945),
+                                    ("hour", -1.3156767939059373),
+                                    ("week-end", -1.9218125974762528)],
+                               n = 14}}),
+       ("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.11778303565638351,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0794415416798357),
+                                    ("Thursdayordinal (digits)", -2.4849066497880004),
+                                    ("day", -2.0794415416798357),
+                                    ("Augustordinal (digits)", -2.4849066497880004),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.0794415416798357),
+                                    ("Tuesdayordinal (digits)", -2.4849066497880004),
+                                    ("month", -1.2321436812926323),
+                                    ("Marchordinal (digits)", -2.4849066497880004)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustordinal (digits)", -1.6094379124341003),
+                                    ("month", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("<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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 24}}),
+       ("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.48550781578170077,
+                               unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.4733057381095205),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("dayday", -2.772588722239781),
+                                    ("hourhour", -2.2617630984737906),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.1780538303479458),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.4849066497880004)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.9555114450274363,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -2.890371757896165),
+                                    ("daymonth", -2.4849066497880004),
+                                    ("<time-of-day> am|pmintersect", -2.890371757896165),
+                                    ("hh:mm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("minuteminute", -1.9740810260220096),
+                                    ("hourhour", -2.4849066497880004),
+                                    ("minutehour", -2.4849066497880004),
+                                    ("hh:mmintersect", -1.9740810260220096),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -2.890371757896165),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -2.890371757896165)],
+                               n = 10}}),
+       ("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}}),
+       ("<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.8873031950009028,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.5163474893680884),
+                                    ("hh:mmhh:mm", -1.5163474893680884),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.327277705584417),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.327277705584417)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("hh:mmtime-of-day (latent)", -1.5723966407537513),
+                                    ("hh:mm<time-of-day> am|pm", -2.871679624884012),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.2771447329921766),
+                                    ("hourhour", -2.0243817644968085),
+                                    ("minutehour", -1.262241712449912),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day>time-of-day (latent)", -2.871679624884012),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -2.871679624884012)],
+                               n = 20}}),
+       ("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.35667494393873245,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5257286443082556),
+                                    ("Marchinteger (numeric)", -2.8134107167600364),
+                                    ("Aprilinteger (numeric)", -3.2188758248682006),
+                                    ("month", -0.8209805520698302),
+                                    ("Februaryinteger (numeric)", -1.9661128563728327),
+                                    ("Septemberinteger (numeric)", -2.8134107167600364),
+                                    ("Octoberinteger (numeric)", -2.8134107167600364),
+                                    ("Julyinteger (numeric)", -2.120263536200091)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.2039728043259361, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.159484249353372),
+                                    ("Marchinteger (numeric)", -2.5649493574615367),
+                                    ("Aprilinteger (numeric)", -2.5649493574615367),
+                                    ("month", -0.9555114450274363),
+                                    ("Julyinteger (numeric)", -1.466337068793427)],
+                               n = 9}}),
+       ("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}}),
+       ("seasons",
+        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-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}}),
+       ("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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hour", -1.2992829841302609)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.03688192726104),
+                                    ("tomorrow", -2.03688192726104), ("day", -1.3437347467010947),
+                                    ("time-of-day (latent)", -2.4423470353692043),
+                                    ("<time-of-day> am|pm", -2.4423470353692043),
+                                    ("Christmas", -2.03688192726104), ("hour", -1.749199854809259)],
+                               n = 8}}),
+       ("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}}),
+       ("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}}),
+       ("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.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.2992829841302609),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.9924301646902063),
+                                    ("month", -0.7884573603642702),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("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.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.6026896854443837),
+                                    ("Martin Luther King's Day", -2.6026896854443837),
+                                    ("intersect", -2.6026896854443837),
+                                    ("Monday", -2.6026896854443837), ("day", -1.2163953243244932),
+                                    ("Thanksgiving Day", -2.6026896854443837),
+                                    ("hour", -2.1972245773362196), ("seasons", -1.9095425048844386),
+                                    ("week-end", -2.6026896854443837)],
+                               n = 9},
+                   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}})]
diff --git a/Duckling/Ranking/Classifiers/EN_US.hs b/Duckling/Ranking/Classifiers/EN_US.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/EN_US.hs
@@ -0,0 +1,2349 @@
+-- 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.EN_US (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+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 = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hh:mm", -1.7047480922384253), ("hour", -1.2992829841302609),
+                                    ("minute", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.7740538191727457, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178},
+                   koData =
+                     ClassData{prior = -0.6182992897635128,
+                               unseen = -5.3471075307174685,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 208}}),
+       ("<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.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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 = -0.10536051565782628,
+                               unseen = -4.787491742782046,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -3.6805112044434196),
+                                    ("integer after|past <hour-of-day>", -3.6805112044434196),
+                                    ("half after|past <hour-of-day>", -4.085976312551584),
+                                    ("time-of-day (latent)", -1.7346010553881064),
+                                    ("hhmm (latent)", -3.392829131991639),
+                                    ("<time-of-day> am|pm", -1.7833912195575383),
+                                    ("hh:mm", -3.169685580677429),
+                                    ("about|exactly <time-of-day>", -3.6805112044434196),
+                                    ("hour", -1.1415373333851437),
+                                    ("<time-of-day> sharp|exactly", -4.085976312551584),
+                                    ("minute", -1.8887517352153647)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.1895840668738362),
+                                    ("hour", -1.1895840668738362)],
+                               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}}),
+       ("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 = -2.409755157906053e-2,
+                               unseen = -3.7612001156935624,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 41},
+                   koData =
+                     ClassData{prior = -3.7376696182833684,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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 = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.3364722366212129),
+                                    ("integer (0..19)integer (20..90)", -1.252762968495368)],
+                               n = 5}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4634795031687923, unseen = -6.169610732491456,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<datetime> - <datetime> (interval)on <date>",
+                                     -4.558078578454241),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.558078578454241),
+                                    ("hourday", -3.769621218089971),
+                                    ("dayhour", -3.223077511721901),
+                                    ("daymonth", -4.781222129768451),
+                                    ("monthday", -5.0689042022202315),
+                                    ("monthyear", -3.8649313978942956),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.474369310328396),
+                                    ("Christmasyear", -5.474369310328396),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.474369310328396),
+                                    ("houryear", -5.474369310328396),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -5.474369310328396),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.781222129768451),
+                                    ("<time-of-day> am|pmintersect", -4.221606341833028),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -5.474369310328396),
+                                    ("Marchyear", -5.474369310328396),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
+                                     -5.0689042022202315),
+                                    ("intersect<time-of-day> am|pm", -5.474369310328396),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.474369310328396),
+                                    ("monthhour", -5.0689042022202315),
+                                    ("last <day-of-week> of <time>year", -5.474369310328396),
+                                    ("todayat <time-of-day>", -5.474369310328396),
+                                    ("Thursday<time> timezone", -5.0689042022202315),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -5.474369310328396),
+                                    ("dayday", -3.459466289786131),
+                                    ("Thanksgiving Dayyear", -4.375757021660286),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.474369310328396),
+                                    ("Tuesdayin <named-month>", -5.474369310328396),
+                                    ("mm/ddat <time-of-day>", -5.474369310328396),
+                                    ("tonightat <time-of-day>", -5.474369310328396),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -4.781222129768451),
+                                    ("today<time-of-day> am|pm", -5.474369310328396),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.0689042022202315),
+                                    ("at <time-of-day><time> <part-of-day>", -5.474369310328396),
+                                    ("mm/dd<time-of-day> am|pm", -5.474369310328396),
+                                    ("hourhour", -4.221606341833028),
+                                    ("<time-of-day> am|pmon <date>", -3.459466289786131),
+                                    ("Wednesdaythis|last|next <cycle>", -5.474369310328396),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.970291913552122),
+                                    ("dayyear", -3.0320222749591914),
+                                    ("last weekend of <named-month>year", -5.474369310328396),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("<time-of-day> am|pmtomorrow", -4.781222129768451),
+                                    ("minutehour", -4.558078578454241),
+                                    ("Mother's Dayyear", -5.474369310328396),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.0689042022202315),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -3.769621218089971),
+                                    ("for <duration> from <time>December", -5.474369310328396),
+                                    ("tomorrow<time-of-day> sharp|exactly", -5.474369310328396),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.558078578454241),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.0689042022202315),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.558078578454241),
+                                    ("Mondayin|during the <part-of-day>", -5.474369310328396),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.0689042022202315),
+                                    ("intersectin|during the <part-of-day>", -5.474369310328396),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.781222129768451),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -4.558078578454241),
+                                    ("at <time-of-day>intersect", -5.0689042022202315),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -5.474369310328396),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.474369310328396),
+                                    ("dayminute", -3.1717842173343502),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.0689042022202315),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -5.474369310328396),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.0689042022202315),
+                                    ("<ordinal> <cycle> of <time>year", -5.474369310328396),
+                                    ("minuteday", -2.0731719286662407),
+                                    ("absorption of , after named dayintersect",
+                                     -5.474369310328396),
+                                    ("Octoberyear", -4.221606341833028),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -5.474369310328396),
+                                    ("<day-of-month> (ordinal or number) <named-month>year",
+                                     -5.474369310328396),
+                                    ("year<time-of-day> am|pm", -5.474369310328396),
+                                    ("Septemberyear", -5.0689042022202315),
+                                    ("at <time-of-day>on <date>", -4.375757021660286),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.781222129768451),
+                                    ("Halloweenyear", -5.474369310328396),
+                                    ("dayweek", -5.474369310328396),
+                                    ("weekyear", -5.0689042022202315),
+                                    ("hh:mmin|during the <part-of-day>", -4.781222129768451),
+                                    ("Father's Dayyear", -5.474369310328396),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.0689042022202315),
+                                    ("February<time> <part-of-day>", -5.474369310328396),
+                                    ("Martin Luther King's Dayyear", -5.0689042022202315),
+                                    ("tomorrowat <time-of-day>", -4.781222129768451),
+                                    ("between <time> and <time>on <date>", -4.781222129768451),
+                                    ("at <time-of-day>tomorrow", -5.0689042022202315),
+                                    ("tomorrow<time-of-day> am|pm", -5.474369310328396),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -5.474369310328396),
+                                    ("black fridayyear", -5.0689042022202315),
+                                    ("Labor Dayyear", -5.474369310328396),
+                                    ("Februaryintersect", -5.474369310328396),
+                                    ("last <cycle> of <time>year", -4.781222129768451),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -5.474369310328396),
+                                    ("yearminute", -5.474369310328396)],
+                               n = 173},
+                   koData =
+                     ClassData{prior = -0.9917982843823002, unseen = -5.817111159963204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("in <named-month>year", -5.120983351265121),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.120983351265121),
+                                    ("hourday", -5.120983351265121),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.120983351265121),
+                                    ("dayhour", -3.329223882037066),
+                                    ("daymonth", -3.041541809585285),
+                                    ("monthday", -4.715518243156957),
+                                    ("monthyear", -4.427836170705175),
+                                    ("intersecthh:mm", -5.120983351265121),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.120983351265121),
+                                    ("houryear", -5.120983351265121),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.120983351265121),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.120983351265121),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.427836170705175),
+                                    ("<time-of-day> am|pmintersect", -3.868220382769753),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -4.204692619390966),
+                                    ("Tuesdayafter <time-of-day>", -5.120983351265121),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.120983351265121),
+                                    ("absorption of , after named dayJuly", -4.715518243156957),
+                                    ("monthhour", -5.120983351265121),
+                                    ("hourmonth", -4.427836170705175),
+                                    ("todayat <time-of-day>", -5.120983351265121),
+                                    ("dayday", -4.715518243156957),
+                                    ("mm/ddat <time-of-day>", -4.715518243156957),
+                                    ("<time-of-day> am|pmon <date>", -3.868220382769753),
+                                    ("dayyear", -3.868220382769753),
+                                    ("Thursdaymm/dd", -5.120983351265121),
+                                    ("Thursdayat <time-of-day>", -5.120983351265121),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.120983351265121),
+                                    ("monthminute", -5.120983351265121),
+                                    ("<time-of-day> am|pmtomorrow", -5.120983351265121),
+                                    ("Thursdayhh:mm", -5.120983351265121),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.120983351265121),
+                                    ("Fridayyear", -4.715518243156957),
+                                    ("minutemonth", -3.416235259026696),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.715518243156957),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("Aprilyear", -5.120983351265121),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.120983351265121),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.120983351265121),
+                                    ("yesterday<time-of-day> am|pm", -5.120983351265121),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.204692619390966),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.120983351265121),
+                                    ("until <time-of-day>on <date>", -4.427836170705175),
+                                    ("at <time-of-day>intersect", -4.715518243156957),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.120983351265121),
+                                    ("dayminute", -3.175073202209808),
+                                    ("intersectSeptember", -3.616905954488847),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.120983351265121),
+                                    ("minuteday", -2.317622970358586),
+                                    ("absorption of , after named dayintersect",
+                                     -5.120983351265121),
+                                    ("Februaryin|during the <part-of-day>", -5.120983351265121),
+                                    ("week-endin <named-month>", -5.120983351265121),
+                                    ("Octoberyear", -5.120983351265121),
+                                    ("yearhh:mm", -5.120983351265121),
+                                    ("hh:mmon <date>", -3.616905954488847),
+                                    ("absorption of , after named daySeptember",
+                                     -4.204692619390966),
+                                    ("on <date>September", -4.715518243156957),
+                                    ("at <time-of-day>on <date>", -4.715518243156957),
+                                    ("absorption of , after named dayFebruary", -4.204692619390966),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.120983351265121),
+                                    ("tomorrowat <time-of-day>", -5.120983351265121),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.120983351265121),
+                                    ("tomorrow<time-of-day> am|pm", -5.120983351265121),
+                                    ("after <time-of-day><time-of-day> am|pm", -5.120983351265121),
+                                    ("after <time-of-day>year", -5.120983351265121),
+                                    ("yearminute", -5.120983351265121)],
+                               n = 102}}),
+       ("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.041453874828161, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.5596157879354228),
+                                    ("integer (0..19)", -0.8472978603872037)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.4353180712578455,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3448404862917295),
+                                    ("integer (0..19)", -1.2321436812926323)],
+                               n = 22}}),
+       ("<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 = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
+                               n = 2}}),
+       ("last|next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.430816798843313,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.627081138568543),
+                                    ("integer (0..19)year (grain)", -3.3202283191284883),
+                                    ("integer (numeric)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)second (grain) ", -3.3202283191284883),
+                                    ("integer (0..19)hour (grain)", -3.3202283191284883),
+                                    ("second", -2.8094026953624978),
+                                    ("integer (numeric)second (grain) ", -3.3202283191284883),
+                                    ("integer (numeric)year (grain)", -3.3202283191284883),
+                                    ("day", -2.472930458741285), ("year", -2.8094026953624978),
+                                    ("integer (numeric)week (grain)", -3.0325462466767075),
+                                    ("integer (0..19)month (grain)", -3.3202283191284883),
+                                    ("hour", -2.8094026953624978), ("month", -2.8094026953624978),
+                                    ("integer (numeric)minute (grain)", -3.3202283191284883),
+                                    ("integer (0..19)minute (grain)", -3.3202283191284883),
+                                    ("integer (numeric)month (grain)", -3.3202283191284883),
+                                    ("minute", -2.8094026953624978),
+                                    ("integer (numeric)hour (grain)", -3.3202283191284883),
+                                    ("integer (0..19)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)week (grain)", -3.3202283191284883)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               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}}),
+       ("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}}),
+       ("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.5363047090669756, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1158318155251217),
+                                    ("integer (0..19)", -2.2129729343043585)],
+                               n = 62},
+                   koData =
+                     ClassData{prior = -0.8792494601938059,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -2.197890671877523e-2)],
+                               n = 44}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.2113090936672069, unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -1.6582280766035324,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8}}),
+       ("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.7444404749474959, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -3.2088254890146994),
+                                    ("integer (numeric)day (grain)", -2.515678308454754),
+                                    ("integer (0..19)second (grain) ", -3.9019726695746444),
+                                    ("integer (0..19)hour (grain)", -2.803360380906535),
+                                    ("second", -3.9019726695746444),
+                                    ("integer (numeric)year (grain)", -3.9019726695746444),
+                                    ("day", -2.515678308454754), ("year", -2.9856819377004897),
+                                    ("integer (numeric)week (grain)", -2.9856819377004897),
+                                    ("integer (0..19)month (grain)", -3.4965075614664802),
+                                    ("hour", -2.515678308454754), ("month", -3.4965075614664802),
+                                    ("integer (numeric)minute (grain)", -2.9856819377004897),
+                                    ("integer (0..19)minute (grain)", -2.803360380906535),
+                                    ("minute", -2.2925347571405443),
+                                    ("integer (numeric)hour (grain)", -3.4965075614664802),
+                                    ("integer (0..19)week (grain)", -2.9856819377004897)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -0.6443570163905132, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.8810693652338513),
+                                    ("integer (0..19)year (grain)", -3.5742165457937967),
+                                    ("integer (numeric)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)second (grain) ", -3.5742165457937967),
+                                    ("integer (0..19)hour (grain)", -3.5742165457937967),
+                                    ("second", -3.0633909220278057),
+                                    ("integer (numeric)second (grain) ", -3.5742165457937967),
+                                    ("integer (numeric)year (grain)", -3.5742165457937967),
+                                    ("day", -2.7269186854065928), ("quarter", -3.979681653901961),
+                                    ("year", -3.0633909220278057),
+                                    ("integer (numeric)week (grain)", -3.2865344733420154),
+                                    ("integer (0..19)month (grain)", -3.5742165457937967),
+                                    ("hour", -1.9647786333596962), ("month", -3.0633909220278057),
+                                    ("integer (numeric)minute (grain)", -3.5742165457937967),
+                                    ("integer (0..19)minute (grain)", -3.5742165457937967),
+                                    ("integer (numeric)month (grain)", -3.5742165457937967),
+                                    ("minute", -3.0633909220278057),
+                                    ("integer (numeric)hour (grain)", -2.1078794770003695),
+                                    ("integer (0..19)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)week (grain)", -3.5742165457937967),
+                                    ("integer (0..19)quarter (grain)", -3.979681653901961)],
+                               n = 42}}),
+       ("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.2847365622220242, unseen = -5.231108616854587,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.8394523125933104),
+                                    ("at <time-of-day>", -2.2300144001592104),
+                                    ("<time-of-day> o'clock", -4.127134385045092),
+                                    ("half after|past <hour-of-day>", -4.127134385045092),
+                                    ("time-of-day (latent)", -1.7600107709134747),
+                                    ("hhmm (latent)", -4.532599493153256),
+                                    ("hh:mm", -2.181224235989778),
+                                    ("quarter after|past <hour-of-day>", -4.532599493153256),
+                                    ("about|exactly <time-of-day>", -4.532599493153256),
+                                    ("until <time-of-day>", -3.8394523125933104),
+                                    ("hour", -1.2939210409888755),
+                                    ("<time-of-day> sharp|exactly", -4.532599493153256),
+                                    ("minute", -1.6422277352570913),
+                                    ("after <time-of-day>", -4.532599493153256)],
+                               n = 85},
+                   koData =
+                     ClassData{prior = -1.3951833085371366, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.1780538303479458),
+                                    ("<hour-of-day> <integer>", -3.58351893845611),
+                                    ("time-of-day (latent)", -1.0577902941478545),
+                                    ("hour", -1.0185695809945732), ("minute", -2.890371757896165),
+                                    ("after <time-of-day>", -3.58351893845611)],
+                               n = 28}}),
+       ("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.406722127027582e-2,
+                               unseen = -4.02535169073515,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 54},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               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
+                                   [("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 = -1.0116009116784799,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.6741486494265287),
+                                    ("Martin Luther King's Day", -2.6741486494265287),
+                                    ("Memorial Day", -2.6741486494265287),
+                                    ("Mother's Day", -2.6741486494265287),
+                                    ("day", -1.2878542883066382), ("Sunday", -2.6741486494265287),
+                                    ("Thanksgiving Day", -2.6741486494265287),
+                                    ("hour", -2.6741486494265287), ("Tuesday", -2.6741486494265287),
+                                    ("week-end", -2.6741486494265287)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -3.0204248861443626),
+                                    ("Monday", -3.0204248861443626), ("day", -2.1041341542702074),
+                                    ("Sunday", -3.0204248861443626),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.7676619176489945),
+                                    ("hour", -1.3156767939059373),
+                                    ("week-end", -1.9218125974762528)],
+                               n = 14}}),
+       ("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.11778303565638351,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0794415416798357),
+                                    ("Thursdayordinal (digits)", -2.4849066497880004),
+                                    ("day", -2.0794415416798357),
+                                    ("Augustordinal (digits)", -2.4849066497880004),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.0794415416798357),
+                                    ("Tuesdayordinal (digits)", -2.4849066497880004),
+                                    ("month", -1.2321436812926323),
+                                    ("Marchordinal (digits)", -2.4849066497880004)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustordinal (digits)", -1.6094379124341003),
+                                    ("month", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("<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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 24}}),
+       ("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.48550781578170077,
+                               unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.4733057381095205),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("dayday", -2.772588722239781),
+                                    ("hourhour", -2.2617630984737906),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.1780538303479458),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.4849066497880004)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.9555114450274363,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -2.890371757896165),
+                                    ("daymonth", -2.4849066497880004),
+                                    ("<time-of-day> am|pmintersect", -2.890371757896165),
+                                    ("hh:mm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("minuteminute", -1.9740810260220096),
+                                    ("hourhour", -2.4849066497880004),
+                                    ("minutehour", -2.4849066497880004),
+                                    ("hh:mmintersect", -1.9740810260220096),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -2.890371757896165),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -2.890371757896165)],
+                               n = 10}}),
+       ("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}}),
+       ("<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.8873031950009028,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.5163474893680884),
+                                    ("hh:mmhh:mm", -1.5163474893680884),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.327277705584417),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.327277705584417)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("hh:mmtime-of-day (latent)", -1.5723966407537513),
+                                    ("hh:mm<time-of-day> am|pm", -2.871679624884012),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.2771447329921766),
+                                    ("hourhour", -2.0243817644968085),
+                                    ("minutehour", -1.262241712449912),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day>time-of-day (latent)", -2.871679624884012),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -2.871679624884012)],
+                               n = 20}}),
+       ("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.35667494393873245,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5257286443082556),
+                                    ("Marchinteger (numeric)", -2.8134107167600364),
+                                    ("Aprilinteger (numeric)", -3.2188758248682006),
+                                    ("month", -0.8209805520698302),
+                                    ("Februaryinteger (numeric)", -1.9661128563728327),
+                                    ("Septemberinteger (numeric)", -2.8134107167600364),
+                                    ("Octoberinteger (numeric)", -2.8134107167600364),
+                                    ("Julyinteger (numeric)", -2.120263536200091)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.2039728043259361, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.159484249353372),
+                                    ("Marchinteger (numeric)", -2.5649493574615367),
+                                    ("Aprilinteger (numeric)", -2.5649493574615367),
+                                    ("month", -0.9555114450274363),
+                                    ("Julyinteger (numeric)", -1.466337068793427)],
+                               n = 9}}),
+       ("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}}),
+       ("seasons",
+        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-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}}),
+       ("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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hour", -1.2992829841302609)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.03688192726104),
+                                    ("tomorrow", -2.03688192726104), ("day", -1.3437347467010947),
+                                    ("time-of-day (latent)", -2.4423470353692043),
+                                    ("<time-of-day> am|pm", -2.4423470353692043),
+                                    ("Christmas", -2.03688192726104), ("hour", -1.749199854809259)],
+                               n = 8}}),
+       ("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}}),
+       ("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}}),
+       ("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.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.2992829841302609),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.9924301646902063),
+                                    ("month", -0.7884573603642702),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("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.10536051565782628,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.6026896854443837),
+                                    ("Martin Luther King's Day", -2.6026896854443837),
+                                    ("intersect", -2.6026896854443837),
+                                    ("Monday", -2.6026896854443837), ("day", -1.2163953243244932),
+                                    ("Thanksgiving Day", -2.6026896854443837),
+                                    ("hour", -2.1972245773362196), ("seasons", -1.9095425048844386),
+                                    ("week-end", -2.6026896854443837)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7047480922384253),
+                                    ("day", -1.7047480922384253)],
+                               n = 1}}),
+       ("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}})]
diff --git a/Duckling/Ranking/Classifiers/EN_XX.hs b/Duckling/Ranking/Classifiers/EN_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/EN_XX.hs
@@ -0,0 +1,2349 @@
+-- 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.EN_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+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 = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hh:mm", -1.7047480922384253), ("hour", -1.2992829841302609),
+                                    ("minute", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.7740538191727457, unseen = -5.19295685089021,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 178},
+                   koData =
+                     ClassData{prior = -0.6182992897635128,
+                               unseen = -5.3471075307174685,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 208}}),
+       ("<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.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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 = -0.10536051565782628,
+                               unseen = -4.787491742782046,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -3.6805112044434196),
+                                    ("integer after|past <hour-of-day>", -3.6805112044434196),
+                                    ("half after|past <hour-of-day>", -4.085976312551584),
+                                    ("time-of-day (latent)", -1.7346010553881064),
+                                    ("hhmm (latent)", -3.392829131991639),
+                                    ("<time-of-day> am|pm", -1.7833912195575383),
+                                    ("hh:mm", -3.169685580677429),
+                                    ("about|exactly <time-of-day>", -3.6805112044434196),
+                                    ("hour", -1.1415373333851437),
+                                    ("<time-of-day> sharp|exactly", -4.085976312551584),
+                                    ("minute", -1.8887517352153647)],
+                               n = 54},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.1895840668738362),
+                                    ("hour", -1.1895840668738362)],
+                               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}}),
+       ("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 = -2.409755157906053e-2,
+                               unseen = -3.7612001156935624,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 41},
+                   koData =
+                     ClassData{prior = -3.7376696182833684,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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 = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.3364722366212129),
+                                    ("integer (0..19)integer (20..90)", -1.252762968495368)],
+                               n = 5}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4634795031687923, unseen = -6.169610732491456,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<datetime> - <datetime> (interval)on <date>",
+                                     -4.558078578454241),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.558078578454241),
+                                    ("hourday", -3.769621218089971),
+                                    ("dayhour", -3.223077511721901),
+                                    ("daymonth", -4.781222129768451),
+                                    ("monthday", -5.0689042022202315),
+                                    ("monthyear", -3.8649313978942956),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.474369310328396),
+                                    ("Christmasyear", -5.474369310328396),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.474369310328396),
+                                    ("houryear", -5.474369310328396),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -5.474369310328396),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.781222129768451),
+                                    ("<time-of-day> am|pmintersect", -4.221606341833028),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -5.474369310328396),
+                                    ("Marchyear", -5.474369310328396),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
+                                     -5.0689042022202315),
+                                    ("intersect<time-of-day> am|pm", -5.474369310328396),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.474369310328396),
+                                    ("monthhour", -5.0689042022202315),
+                                    ("last <day-of-week> of <time>year", -5.474369310328396),
+                                    ("todayat <time-of-day>", -5.474369310328396),
+                                    ("Thursday<time> timezone", -5.0689042022202315),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -5.474369310328396),
+                                    ("dayday", -3.459466289786131),
+                                    ("Thanksgiving Dayyear", -4.375757021660286),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.474369310328396),
+                                    ("Tuesdayin <named-month>", -5.474369310328396),
+                                    ("mm/ddat <time-of-day>", -5.474369310328396),
+                                    ("tonightat <time-of-day>", -5.474369310328396),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -4.781222129768451),
+                                    ("today<time-of-day> am|pm", -5.474369310328396),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.0689042022202315),
+                                    ("at <time-of-day><time> <part-of-day>", -5.474369310328396),
+                                    ("mm/dd<time-of-day> am|pm", -5.474369310328396),
+                                    ("hourhour", -4.221606341833028),
+                                    ("<time-of-day> am|pmon <date>", -3.459466289786131),
+                                    ("Wednesdaythis|last|next <cycle>", -5.474369310328396),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.970291913552122),
+                                    ("dayyear", -3.0320222749591914),
+                                    ("last weekend of <named-month>year", -5.474369310328396),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("<time-of-day> am|pmtomorrow", -4.781222129768451),
+                                    ("minutehour", -4.558078578454241),
+                                    ("Mother's Dayyear", -5.474369310328396),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.0689042022202315),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -3.769621218089971),
+                                    ("for <duration> from <time>December", -5.474369310328396),
+                                    ("tomorrow<time-of-day> sharp|exactly", -5.474369310328396),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.558078578454241),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.0689042022202315),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.558078578454241),
+                                    ("Mondayin|during the <part-of-day>", -5.474369310328396),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.0689042022202315),
+                                    ("intersectin|during the <part-of-day>", -5.474369310328396),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.781222129768451),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -4.558078578454241),
+                                    ("at <time-of-day>intersect", -5.0689042022202315),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -5.474369310328396),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.474369310328396),
+                                    ("dayminute", -3.1717842173343502),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.0689042022202315),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -5.474369310328396),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.0689042022202315),
+                                    ("<ordinal> <cycle> of <time>year", -5.474369310328396),
+                                    ("minuteday", -2.0731719286662407),
+                                    ("absorption of , after named dayintersect",
+                                     -5.474369310328396),
+                                    ("Octoberyear", -4.221606341833028),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -5.474369310328396),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -5.474369310328396),
+                                    ("<day-of-month> (ordinal or number) <named-month>year",
+                                     -5.474369310328396),
+                                    ("year<time-of-day> am|pm", -5.474369310328396),
+                                    ("Septemberyear", -5.0689042022202315),
+                                    ("at <time-of-day>on <date>", -4.375757021660286),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.781222129768451),
+                                    ("Halloweenyear", -5.474369310328396),
+                                    ("dayweek", -5.474369310328396),
+                                    ("weekyear", -5.0689042022202315),
+                                    ("hh:mmin|during the <part-of-day>", -4.781222129768451),
+                                    ("Father's Dayyear", -5.474369310328396),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.0689042022202315),
+                                    ("February<time> <part-of-day>", -5.474369310328396),
+                                    ("Martin Luther King's Dayyear", -5.0689042022202315),
+                                    ("tomorrowat <time-of-day>", -4.781222129768451),
+                                    ("between <time> and <time>on <date>", -4.781222129768451),
+                                    ("at <time-of-day>tomorrow", -5.0689042022202315),
+                                    ("tomorrow<time-of-day> am|pm", -5.474369310328396),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -5.474369310328396),
+                                    ("black fridayyear", -5.0689042022202315),
+                                    ("Labor Dayyear", -5.474369310328396),
+                                    ("Februaryintersect", -5.474369310328396),
+                                    ("last <cycle> of <time>year", -4.781222129768451),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -5.474369310328396),
+                                    ("yearminute", -5.474369310328396)],
+                               n = 173},
+                   koData =
+                     ClassData{prior = -0.9917982843823002, unseen = -5.817111159963204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("in <named-month>year", -5.120983351265121),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.120983351265121),
+                                    ("hourday", -5.120983351265121),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.120983351265121),
+                                    ("dayhour", -3.329223882037066),
+                                    ("daymonth", -3.041541809585285),
+                                    ("monthday", -4.715518243156957),
+                                    ("monthyear", -4.427836170705175),
+                                    ("intersecthh:mm", -5.120983351265121),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.120983351265121),
+                                    ("houryear", -5.120983351265121),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.120983351265121),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.120983351265121),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.427836170705175),
+                                    ("<time-of-day> am|pmintersect", -3.868220382769753),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
+                                     -4.204692619390966),
+                                    ("Tuesdayafter <time-of-day>", -5.120983351265121),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.120983351265121),
+                                    ("absorption of , after named dayJuly", -4.715518243156957),
+                                    ("monthhour", -5.120983351265121),
+                                    ("hourmonth", -4.427836170705175),
+                                    ("todayat <time-of-day>", -5.120983351265121),
+                                    ("dayday", -4.715518243156957),
+                                    ("mm/ddat <time-of-day>", -4.715518243156957),
+                                    ("<time-of-day> am|pmon <date>", -3.868220382769753),
+                                    ("dayyear", -3.868220382769753),
+                                    ("Thursdaymm/dd", -5.120983351265121),
+                                    ("Thursdayat <time-of-day>", -5.120983351265121),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.120983351265121),
+                                    ("monthminute", -5.120983351265121),
+                                    ("<time-of-day> am|pmtomorrow", -5.120983351265121),
+                                    ("Thursdayhh:mm", -5.120983351265121),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.120983351265121),
+                                    ("Fridayyear", -4.715518243156957),
+                                    ("minutemonth", -3.416235259026696),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.715518243156957),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("Aprilyear", -5.120983351265121),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -4.715518243156957),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.120983351265121),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.120983351265121),
+                                    ("yesterday<time-of-day> am|pm", -5.120983351265121),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.204692619390966),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.120983351265121),
+                                    ("until <time-of-day>on <date>", -4.427836170705175),
+                                    ("at <time-of-day>intersect", -4.715518243156957),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.120983351265121),
+                                    ("dayminute", -3.175073202209808),
+                                    ("intersectSeptember", -3.616905954488847),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.120983351265121),
+                                    ("minuteday", -2.317622970358586),
+                                    ("absorption of , after named dayintersect",
+                                     -5.120983351265121),
+                                    ("Februaryin|during the <part-of-day>", -5.120983351265121),
+                                    ("week-endin <named-month>", -5.120983351265121),
+                                    ("Octoberyear", -5.120983351265121),
+                                    ("yearhh:mm", -5.120983351265121),
+                                    ("hh:mmon <date>", -3.616905954488847),
+                                    ("absorption of , after named daySeptember",
+                                     -4.204692619390966),
+                                    ("on <date>September", -4.715518243156957),
+                                    ("at <time-of-day>on <date>", -4.715518243156957),
+                                    ("absorption of , after named dayFebruary", -4.204692619390966),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.120983351265121),
+                                    ("tomorrowat <time-of-day>", -5.120983351265121),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.120983351265121),
+                                    ("tomorrow<time-of-day> am|pm", -5.120983351265121),
+                                    ("after <time-of-day><time-of-day> am|pm", -5.120983351265121),
+                                    ("after <time-of-day>year", -5.120983351265121),
+                                    ("yearminute", -5.120983351265121)],
+                               n = 102}}),
+       ("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.041453874828161, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.5596157879354228),
+                                    ("integer (0..19)", -0.8472978603872037)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.4353180712578455,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3448404862917295),
+                                    ("integer (0..19)", -1.2321436812926323)],
+                               n = 22}}),
+       ("<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 = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
+                               n = 2}}),
+       ("last|next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.430816798843313,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.627081138568543),
+                                    ("integer (0..19)year (grain)", -3.3202283191284883),
+                                    ("integer (numeric)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)second (grain) ", -3.3202283191284883),
+                                    ("integer (0..19)hour (grain)", -3.3202283191284883),
+                                    ("second", -2.8094026953624978),
+                                    ("integer (numeric)second (grain) ", -3.3202283191284883),
+                                    ("integer (numeric)year (grain)", -3.3202283191284883),
+                                    ("day", -2.472930458741285), ("year", -2.8094026953624978),
+                                    ("integer (numeric)week (grain)", -3.0325462466767075),
+                                    ("integer (0..19)month (grain)", -3.3202283191284883),
+                                    ("hour", -2.8094026953624978), ("month", -2.8094026953624978),
+                                    ("integer (numeric)minute (grain)", -3.3202283191284883),
+                                    ("integer (0..19)minute (grain)", -3.3202283191284883),
+                                    ("integer (numeric)month (grain)", -3.3202283191284883),
+                                    ("minute", -2.8094026953624978),
+                                    ("integer (numeric)hour (grain)", -3.3202283191284883),
+                                    ("integer (0..19)day (grain)", -3.0325462466767075),
+                                    ("integer (0..19)week (grain)", -3.3202283191284883)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               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}}),
+       ("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}}),
+       ("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.5363047090669756, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1158318155251217),
+                                    ("integer (0..19)", -2.2129729343043585)],
+                               n = 62},
+                   koData =
+                     ClassData{prior = -0.8792494601938059,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -2.197890671877523e-2)],
+                               n = 44}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.2113090936672069, unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -1.6582280766035324,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8}}),
+       ("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.7444404749474959, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.3978952727983707),
+                                    ("integer (0..19)year (grain)", -3.2088254890146994),
+                                    ("integer (numeric)day (grain)", -2.515678308454754),
+                                    ("integer (0..19)second (grain) ", -3.9019726695746444),
+                                    ("integer (0..19)hour (grain)", -2.803360380906535),
+                                    ("second", -3.9019726695746444),
+                                    ("integer (numeric)year (grain)", -3.9019726695746444),
+                                    ("day", -2.515678308454754), ("year", -2.9856819377004897),
+                                    ("integer (numeric)week (grain)", -2.9856819377004897),
+                                    ("integer (0..19)month (grain)", -3.4965075614664802),
+                                    ("hour", -2.515678308454754), ("month", -3.4965075614664802),
+                                    ("integer (numeric)minute (grain)", -2.9856819377004897),
+                                    ("integer (0..19)minute (grain)", -2.803360380906535),
+                                    ("minute", -2.2925347571405443),
+                                    ("integer (numeric)hour (grain)", -3.4965075614664802),
+                                    ("integer (0..19)week (grain)", -2.9856819377004897)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -0.6443570163905132, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.8810693652338513),
+                                    ("integer (0..19)year (grain)", -3.5742165457937967),
+                                    ("integer (numeric)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)second (grain) ", -3.5742165457937967),
+                                    ("integer (0..19)hour (grain)", -3.5742165457937967),
+                                    ("second", -3.0633909220278057),
+                                    ("integer (numeric)second (grain) ", -3.5742165457937967),
+                                    ("integer (numeric)year (grain)", -3.5742165457937967),
+                                    ("day", -2.7269186854065928), ("quarter", -3.979681653901961),
+                                    ("year", -3.0633909220278057),
+                                    ("integer (numeric)week (grain)", -3.2865344733420154),
+                                    ("integer (0..19)month (grain)", -3.5742165457937967),
+                                    ("hour", -1.9647786333596962), ("month", -3.0633909220278057),
+                                    ("integer (numeric)minute (grain)", -3.5742165457937967),
+                                    ("integer (0..19)minute (grain)", -3.5742165457937967),
+                                    ("integer (numeric)month (grain)", -3.5742165457937967),
+                                    ("minute", -3.0633909220278057),
+                                    ("integer (numeric)hour (grain)", -2.1078794770003695),
+                                    ("integer (0..19)day (grain)", -3.2865344733420154),
+                                    ("integer (0..19)week (grain)", -3.5742165457937967),
+                                    ("integer (0..19)quarter (grain)", -3.979681653901961)],
+                               n = 42}}),
+       ("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.2847365622220242, unseen = -5.231108616854587,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.8394523125933104),
+                                    ("at <time-of-day>", -2.2300144001592104),
+                                    ("<time-of-day> o'clock", -4.127134385045092),
+                                    ("half after|past <hour-of-day>", -4.127134385045092),
+                                    ("time-of-day (latent)", -1.7600107709134747),
+                                    ("hhmm (latent)", -4.532599493153256),
+                                    ("hh:mm", -2.181224235989778),
+                                    ("quarter after|past <hour-of-day>", -4.532599493153256),
+                                    ("about|exactly <time-of-day>", -4.532599493153256),
+                                    ("until <time-of-day>", -3.8394523125933104),
+                                    ("hour", -1.2939210409888755),
+                                    ("<time-of-day> sharp|exactly", -4.532599493153256),
+                                    ("minute", -1.6422277352570913),
+                                    ("after <time-of-day>", -4.532599493153256)],
+                               n = 85},
+                   koData =
+                     ClassData{prior = -1.3951833085371366, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.1780538303479458),
+                                    ("<hour-of-day> <integer>", -3.58351893845611),
+                                    ("time-of-day (latent)", -1.0577902941478545),
+                                    ("hour", -1.0185695809945732), ("minute", -2.890371757896165),
+                                    ("after <time-of-day>", -3.58351893845611)],
+                               n = 28}}),
+       ("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.406722127027582e-2,
+                               unseen = -4.02535169073515,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 54},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               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
+                                   [("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 = -1.0116009116784799,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.6741486494265287),
+                                    ("Martin Luther King's Day", -2.6741486494265287),
+                                    ("Memorial Day", -2.6741486494265287),
+                                    ("Mother's Day", -2.6741486494265287),
+                                    ("day", -1.2878542883066382), ("Sunday", -2.6741486494265287),
+                                    ("Thanksgiving Day", -2.6741486494265287),
+                                    ("hour", -2.6741486494265287), ("Tuesday", -2.6741486494265287),
+                                    ("week-end", -2.6741486494265287)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -3.0204248861443626),
+                                    ("Monday", -3.0204248861443626), ("day", -2.1041341542702074),
+                                    ("Sunday", -3.0204248861443626),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.7676619176489945),
+                                    ("hour", -1.3156767939059373),
+                                    ("week-end", -1.9218125974762528)],
+                               n = 14}}),
+       ("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.11778303565638351,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.0794415416798357),
+                                    ("Thursdayordinal (digits)", -2.4849066497880004),
+                                    ("day", -2.0794415416798357),
+                                    ("Augustordinal (digits)", -2.4849066497880004),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.0794415416798357),
+                                    ("Tuesdayordinal (digits)", -2.4849066497880004),
+                                    ("month", -1.2321436812926323),
+                                    ("Marchordinal (digits)", -2.4849066497880004)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustordinal (digits)", -1.6094379124341003),
+                                    ("month", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("<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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("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}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 24}}),
+       ("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.48550781578170077,
+                               unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.4733057381095205),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("dayday", -2.772588722239781),
+                                    ("hourhour", -2.2617630984737906),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -2.772588722239781),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.1780538303479458),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm",
+                                     -2.4849066497880004)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.9555114450274363,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -2.890371757896165),
+                                    ("daymonth", -2.4849066497880004),
+                                    ("<time-of-day> am|pmintersect", -2.890371757896165),
+                                    ("hh:mm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("minuteminute", -1.9740810260220096),
+                                    ("hourhour", -2.4849066497880004),
+                                    ("minutehour", -2.4849066497880004),
+                                    ("hh:mmintersect", -1.9740810260220096),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -2.890371757896165),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -2.890371757896165)],
+                               n = 10}}),
+       ("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}}),
+       ("<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.8873031950009028,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.5163474893680884),
+                                    ("hh:mmhh:mm", -1.5163474893680884),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.327277705584417),
+                                    ("hourhour", -1.7676619176489945),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.327277705584417)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("hh:mmtime-of-day (latent)", -1.5723966407537513),
+                                    ("hh:mm<time-of-day> am|pm", -2.871679624884012),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.2771447329921766),
+                                    ("hourhour", -2.0243817644968085),
+                                    ("minutehour", -1.262241712449912),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.2771447329921766),
+                                    ("at <time-of-day>time-of-day (latent)", -2.871679624884012),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -2.871679624884012)],
+                               n = 20}}),
+       ("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.35667494393873245,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5257286443082556),
+                                    ("Marchinteger (numeric)", -2.8134107167600364),
+                                    ("Aprilinteger (numeric)", -3.2188758248682006),
+                                    ("month", -0.8209805520698302),
+                                    ("Februaryinteger (numeric)", -1.9661128563728327),
+                                    ("Septemberinteger (numeric)", -2.8134107167600364),
+                                    ("Octoberinteger (numeric)", -2.8134107167600364),
+                                    ("Julyinteger (numeric)", -2.120263536200091)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.2039728043259361, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.159484249353372),
+                                    ("Marchinteger (numeric)", -2.5649493574615367),
+                                    ("Aprilinteger (numeric)", -2.5649493574615367),
+                                    ("month", -0.9555114450274363),
+                                    ("Julyinteger (numeric)", -1.466337068793427)],
+                               n = 9}}),
+       ("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}}),
+       ("seasons",
+        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-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}}),
+       ("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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.7047480922384253),
+                                    ("<time-of-day> am|pm", -1.7047480922384253),
+                                    ("hour", -1.2992829841302609)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.03688192726104),
+                                    ("tomorrow", -2.03688192726104), ("day", -1.3437347467010947),
+                                    ("time-of-day (latent)", -2.4423470353692043),
+                                    ("<time-of-day> am|pm", -2.4423470353692043),
+                                    ("Christmas", -2.03688192726104), ("hour", -1.749199854809259)],
+                               n = 8}}),
+       ("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}}),
+       ("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}}),
+       ("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.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.2992829841302609),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.9924301646902063),
+                                    ("month", -0.7884573603642702),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.9924301646902063)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("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.10536051565782628,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.6026896854443837),
+                                    ("Martin Luther King's Day", -2.6026896854443837),
+                                    ("intersect", -2.6026896854443837),
+                                    ("Monday", -2.6026896854443837), ("day", -1.2163953243244932),
+                                    ("Thanksgiving Day", -2.6026896854443837),
+                                    ("hour", -2.1972245773362196), ("seasons", -1.9095425048844386),
+                                    ("week-end", -2.6026896854443837)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7047480922384253),
+                                    ("day", -1.7047480922384253)],
+                               n = 1}}),
+       ("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}})]
diff --git a/Duckling/Ranking/Classifiers/ES.hs b/Duckling/Ranking/Classifiers/ES.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/ES.hs
+++ /dev/null
@@ -1,1160 +0,0 @@
--- 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.ES (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("midnight",
-        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> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.5839478885949533, unseen = -4.0943445622221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 58},
-                   koData =
-                     ClassData{prior = -0.8157495026522777, unseen = -3.871201010907891,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 46}}),
-       ("the day before yesterday",
-        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(:|.|h)mm (time-of-day)",
-        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}}),
-       ("<named-month|named-day> past",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("el <time>", -1.2992829841302609),
-                                    ("day", -0.7884573603642702),
-                                    ("named-day", -1.2992829841302609)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd[/-]mm",
-        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}}),
-       ("intersect by `de`",
-        Classifier{okData =
-                     ClassData{prior = -0.16362942378180204,
-                               unseen = -4.812184355372417,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("el <day-of-month> (non ordinal)intersect by `de`",
-                                     -3.7054087560651467),
-                                    ("day of month (1st)named-month", -3.1945831322991562),
-                                    ("daymonth", -1.7594986070098335),
-                                    ("monthyear", -3.7054087560651467),
-                                    ("named-dayel proximo <cycle> ", -4.110873864173311),
-                                    ("named-dayla <cycle> pasado", -4.110873864173311),
-                                    ("el <time>named-month", -3.7054087560651467),
-                                    ("dayyear", -2.164963715117998),
-                                    ("dd-dd <month>(interval)year", -4.110873864173311),
-                                    ("el <time>el <cycle> (proximo|que viene)", -4.110873864173311),
-                                    ("two time tokens separated by \",\"named-month",
-                                     -4.110873864173311),
-                                    ("named-monthyear", -3.7054087560651467),
-                                    ("el <time>year", -3.7054087560651467),
-                                    ("el <time>la <cycle> pasado", -4.110873864173311),
-                                    ("el <day-of-month> de <named-month>year", -3.7054087560651467),
-                                    ("el <time>este|en un <cycle>", -3.7054087560651467),
-                                    ("named-dayel <cycle> (proximo|que viene)", -4.110873864173311),
-                                    ("el <day-of-month> (non ordinal)named-month",
-                                     -2.406125771934886),
-                                    ("<day-of-month> de <named-month>year", -3.7054087560651467),
-                                    ("two time tokens separated by \",\"year", -3.417726683613366),
-                                    ("two time tokens separated by \",\"intersect by `de`",
-                                     -4.110873864173311),
-                                    ("dayweek", -2.406125771934886),
-                                    ("intersect by `de`year", -3.417726683613366),
-                                    ("named-dayeste|en un <cycle>", -3.417726683613366)],
-                               n = 45},
-                   koData =
-                     ClassData{prior = -1.890850371872286, unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthyear", -3.1780538303479458),
-                                    ("hourmonth", -2.772588722239781),
-                                    ("monthmonth", -3.1780538303479458),
-                                    ("a las <time-of-day>named-month", -2.772588722239781),
-                                    ("dayyear", -3.1780538303479458),
-                                    ("minutemonth", -2.772588722239781),
-                                    ("named-monthyear", -3.1780538303479458),
-                                    ("de <datetime> - <datetime> (interval)named-month",
-                                     -3.1780538303479458),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -3.1780538303479458),
-                                    ("<day-of-month> de <named-month>year", -3.1780538303479458),
-                                    ("intersect by `de`year", -3.1780538303479458),
-                                    ("<hour-of-day> <integer> (as relative minutes)intersect by `de`",
-                                     -3.1780538303479458),
-                                    ("minuteyear", -3.1780538303479458)],
-                               n = 8}}),
-       ("n pasados <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..15)a\241o (grain)", -1.3862943611198906),
-                                    ("year", -1.3862943611198906),
-                                    ("number (0..15)mes (grain)", -1.3862943611198906),
-                                    ("month", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> and half",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>", -1.3217558399823195),
-                                    ("time-of-day (latent)", -1.3217558399823195),
-                                    ("hour", -0.7621400520468967)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("pasados n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4849066497880004),
-                                    ("integer (numeric)dia (grain)", -2.4849066497880004),
-                                    ("integer (numeric)mes (grain)", -2.4849066497880004),
-                                    ("second", -2.4849066497880004),
-                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
-                                    ("day", -2.4849066497880004),
-                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
-                                    ("year", -2.4849066497880004), ("month", -2.4849066497880004),
-                                    ("minute", -2.4849066497880004),
-                                    ("integer (numeric)a\241o (grain)", -2.4849066497880004),
-                                    ("number (0..15)semana (grain)", -2.4849066497880004)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("semana (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}}),
-       ("two time tokens separated by \",\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayel <time>", -2.159484249353372),
-                                    ("dayday", -0.8602012652231115),
-                                    ("named-dayel <day-of-month> (non ordinal)",
-                                     -2.5649493574615367),
-                                    ("named-dayintersect by `de`", -1.466337068793427),
-                                    ("named-day<day-of-month> de <named-month>",
-                                     -2.5649493574615367),
-                                    ("named-dayel <day-of-month> de <named-month>",
-                                     -2.5649493574615367)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<dim time> de la manana",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>", -1.3217558399823195),
-                                    ("time-of-day (latent)", -1.3217558399823195),
-                                    ("hour", -0.7621400520468967)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("del mediod\237a",
-        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> de <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..15)named-month", -2.151762203259462),
-                                    ("integer (numeric)named-month", -0.9279867716373464),
-                                    ("month", -0.7166776779701395)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -2.3978952727983707,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.8472978603872037),
-                                    ("month", -0.8472978603872037)],
-                               n = 2}}),
-       ("<time-of-day> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.3528213746227423, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.6109179126442243),
-                                    ("dayhour", -2.2246235515243336),
-                                    ("tomorrowin the <part-of-day>", -3.6109179126442243),
-                                    ("a las <time-of-day>del mediod\237a", -3.6109179126442243),
-                                    ("el <day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.6109179126442243),
-                                    ("hourhour", -2.2246235515243336),
-                                    ("a las <time-of-day>in the <part-of-day>",
-                                     -2.3581549441488563),
-                                    ("intersectin the <part-of-day>", -3.6109179126442243),
-                                    ("minutehour", -1.739115735742633),
-                                    ("intersect by `de`in the <part-of-day>", -3.6109179126442243),
-                                    ("<hour-of-day> and halfin the <part-of-day>",
-                                     -3.20545280453606),
-                                    ("named-dayin the <part-of-day>", -3.6109179126442243),
-                                    ("<hour-of-day> and <relative minutes>del mediod\237a",
-                                     -3.20545280453606),
-                                    ("el <time>in the <part-of-day>", -3.6109179126442243),
-                                    ("<hour-of-day> and quarterin the <part-of-day>",
-                                     -2.6946271807700692),
-                                    ("yesterdayin the <part-of-day>", -3.6109179126442243),
-                                    ("time-of-day (latent)in the <part-of-day>",
-                                     -2.917770732084279)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -1.213022639845854, unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -1.4816045409242156),
-                                    ("year (latent)del mediod\237a", -3.0910424533583156),
-                                    ("monthhour", -3.0910424533583156),
-                                    ("hourhour", -3.0910424533583156),
-                                    ("named-monthin the <part-of-day>", -3.0910424533583156),
-                                    ("year (latent)in the <part-of-day>", -1.5869650565820417),
-                                    ("time-of-day (latent)in the <part-of-day>",
-                                     -3.0910424533583156)],
-                               n = 11}}),
-       ("de <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.791759469228055),
-                                    ("monthyear", -1.791759469228055),
-                                    ("monthhour", -1.791759469228055),
-                                    ("named-monthyear (latent)", -1.791759469228055),
-                                    ("named-monthtime-of-day (latent)", -1.791759469228055),
-                                    ("named-month<day-of-month> de <named-month>",
-                                     -1.791759469228055)],
-                               n = 3}}),
-       ("<time-of-day> horas",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>", -1.252762968495368),
-                                    ("time-of-day (latent)", -1.252762968495368),
-                                    ("hour", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.7884573603642702),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.2578291093020998,
-                               unseen = -4.6443908991413725,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.9415818076696905),
-                                    ("dayhour", -1.9956716586143772),
-                                    ("tomorrowin the <part-of-day>", -3.9415818076696905),
-                                    ("el <day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.9415818076696905),
-                                    ("hourhour", -3.0252910757955354),
-                                    ("now<hour-of-day> minus quarter (as relative minutes)",
-                                     -3.9415818076696905),
-                                    ("dayyear", -3.0252910757955354),
-                                    ("a las <time-of-day>in the <part-of-day>",
-                                     -2.6888188391743224),
-                                    ("intersectin the <part-of-day>", -3.9415818076696905),
-                                    ("<named-month> <day-of-month>del <year>", -3.9415818076696905),
-                                    ("minutehour", -2.33214389523559),
-                                    ("intersect by `de`in the <part-of-day>", -3.9415818076696905),
-                                    ("now<hour-of-day> and <relative minutes>",
-                                     -3.9415818076696905),
-                                    ("<hour-of-day> and halfin the <part-of-day>",
-                                     -3.536116699561526),
-                                    ("named-dayin the <part-of-day>", -3.9415818076696905),
-                                    ("tomorrowa las <time-of-day>", -3.536116699561526),
-                                    ("named-daya las <time-of-day>", -3.9415818076696905),
-                                    ("named-dayintersect", -3.9415818076696905),
-                                    ("dayminute", -3.0252910757955354),
-                                    ("<named-month> <day-of-month>el <time>", -3.9415818076696905),
-                                    ("named-day<dim time> de la manana", -3.9415818076696905),
-                                    ("el <time>in the <part-of-day>", -3.9415818076696905),
-                                    ("named-day<time-of-day> <part-of-day>", -3.9415818076696905),
-                                    ("dd[/-]mmyear", -3.536116699561526),
-                                    ("nowa las <time-of-day>", -3.536116699561526),
-                                    ("<hour-of-day> and quarterin the <part-of-day>",
-                                     -3.0252910757955354),
-                                    ("yesterdayin the <part-of-day>", -3.9415818076696905)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -1.4816045409242156, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.3141860046725258),
-                                    ("dayhour", -2.6210388241125804),
-                                    ("<day-of-month> de <named-month>a las <time-of-day>",
-                                     -3.3141860046725258),
-                                    ("<time-of-day> am|pm<day-of-month> de <named-month>",
-                                     -3.3141860046725258),
-                                    ("monthhour", -2.908720896564361),
-                                    ("now<hour-of-day> and <relative minutes>",
-                                     -3.3141860046725258),
-                                    ("dayminute", -2.908720896564361),
-                                    ("named-monthin the <part-of-day>", -3.3141860046725258),
-                                    ("named-montha las <time-of-day>", -3.3141860046725258),
-                                    ("nowa las <time-of-day>", -2.6210388241125804),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -2.908720896564361),
-                                    ("minuteyear", -2.908720896564361)],
-                               n = 10}}),
-       ("a las <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.338160893905101e-2,
-                               unseen = -4.634728988229636,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> and half", -3.2386784521643803),
-                                    ("<time-of-day> horas", -3.9318256327243257),
-                                    ("<hour-of-day> and quarter", -3.0155349008501706),
-                                    ("time-of-day (latent)", -1.2237754316221157),
-                                    ("<hour-of-day> and <relative minutes>", -2.833213344056216),
-                                    ("<time-of-day> am|pm", -3.9318256327243257),
-                                    ("<hour-of-day> minus <integer> (as relative minutes)",
-                                     -3.9318256327243257),
-                                    ("<hour-of-day> minus quarter (as relative minutes)",
-                                     -3.5263605246161616),
-                                    ("hour", -1.1592369104845446), ("minute", -1.8523840910444898)],
-                               n = 46},
-                   koData =
-                     ClassData{prior = -2.5257286443082556,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.791759469228055),
-                                    ("<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,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1786549963416462),
-                                    ("number (0..15)", -0.6190392084062235),
-                                    ("number (20..90)", -1.8718021769015913)],
-                               n = 10}}),
-       ("el <cycle> (proximo|que viene)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("semana (grain)", -1.540445040947149),
-                                    ("mes (grain)", -1.9459101490553135),
-                                    ("year", -1.9459101490553135),
-                                    ("a\241o (grain)", -1.9459101490553135),
-                                    ("month", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yesterday",
-        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}}),
-       ("<hour-of-day> and quarter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>", -1.4350845252893227),
-                                    ("time-of-day (latent)", -1.252762968495368),
-                                    ("hour", -0.7419373447293773)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dentro de <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hace <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.8718021769015913), ("year", -1.8718021769015913),
-                                    ("<integer> <unit-of-duration>", -0.9555114450274363),
-                                    ("hour", -1.8718021769015913), ("month", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("el <day-of-month> de <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..15)named-month", -1.749199854809259),
-                                    ("integer (numeric)named-month", -1.0560526742493137),
-                                    ("month", -0.7375989431307791)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-month",
-        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}}),
-       ("el <time>",
-        Classifier{okData =
-                     ClassData{prior = -5.406722127027582e-2,
-                               unseen = -4.465908118654584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month|named-day> past", -3.355735007585398),
-                                    ("dd[/-]mm", -3.068052935133617),
-                                    ("intersect by `de`", -2.257122718917288),
-                                    ("<day-of-month> de <named-month>", -2.056452023455137),
-                                    ("<time-of-day> <part-of-day>", -3.7612001156935624),
-                                    ("intersect", -3.7612001156935624),
-                                    ("day", -0.9279867716373464), ("year", -3.7612001156935624),
-                                    ("named-day", -2.374905754573672),
-                                    ("day of month (1st)", -3.355735007585398),
-                                    ("<named-month|named-day> next", -3.7612001156935624),
-                                    ("hour", -3.355735007585398)],
-                               n = 36},
-                   koData =
-                     ClassData{prior = -2.9444389791664407, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon", -2.2512917986064953), ("hour", -2.2512917986064953),
-                                    ("minute", -2.2512917986064953),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -2.2512917986064953)],
-                               n = 2}}),
-       ("now",
-        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}}),
-       ("ordinals (primero..10)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("evening", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number (0..15)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9318256327243257,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 49},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("este|en un <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.0296194171811581),
-                                    ("semana (grain)", -1.0296194171811581),
-                                    ("year", -1.9459101490553135),
-                                    ("a\241o (grain)", -1.9459101490553135)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2006706954621511),
-                                    ("number (0..15)", -1.7047480922384253)],
-                               n = 9}}),
-       ("dd-dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("mes (grain)",
-        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}}),
-       ("number (20..90)",
-        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}}),
-       ("<day-of-week> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayinteger (numeric)", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("afternoon",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.3272129112084162,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.1939224684724346),
-                                    ("number (0..15)", -0.3610133455373305)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -1.276293465905562, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3364722366212129),
-                                    ("number (0..15)", -1.252762968495368)],
-                               n = 12}}),
-       ("<hour-of-day> and <relative minutes>",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-                                     -2.1972245773362196),
-                                    ("time-of-day (latent)number (0..15)", -2.6026896854443837),
-                                    ("a las <time-of-day>number (20..90)", -2.1972245773362196),
-                                    ("a las <time-of-day>number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-                                     -2.1972245773362196),
-                                    ("hour", -0.8979415932059586),
-                                    ("a las <time-of-day>number (0..15)", -2.6026896854443837),
-                                    ("time-of-day (latent)number (20..90)", -2.1972245773362196)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>number (20..90)", -1.6094379124341003),
-                                    ("hour", -1.0986122886681098),
-                                    ("time-of-day (latent)number (20..90)", -1.6094379124341003)],
-                               n = 4}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3}}),
-       ("en <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9444389791664407), ("second", -2.9444389791664407),
-                                    ("day", -2.538973871058276), ("year", -2.538973871058276),
-                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
-                                    ("hour", -2.2512917986064953), ("month", -2.9444389791664407),
-                                    ("minute", -1.845826690498331)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("n <cycle> (proximo|que viene)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("integer (numeric)semana (grain)", -1.791759469228055),
-                                    ("year", -1.791759469228055),
-                                    ("number (0..15)mes (grain)", -1.791759469228055),
-                                    ("month", -1.791759469228055),
-                                    ("integer (numeric)a\241o (grain)", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -4.143134726391533,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.028522096376982),
-                                    ("integer (numeric)hora (grain)", -3.4339872044851463),
-                                    ("integer (numeric)dia (grain)", -3.4339872044851463),
-                                    ("number (0..15)segundo (grain)", -3.4339872044851463),
-                                    ("second", -3.4339872044851463),
-                                    ("number (0..15)a\241o (grain)", -3.028522096376982),
-                                    ("integer (numeric)minutos (grain)", -2.740840023925201),
-                                    ("day", -3.028522096376982), ("year", -2.740840023925201),
-                                    ("number (0..15)mes (grain)", -3.028522096376982),
-                                    ("number (0..15)hora (grain)", -2.740840023925201),
-                                    ("hour", -2.3353749158170367), ("month", -3.028522096376982),
-                                    ("number (0..15)dia (grain)", -3.4339872044851463),
-                                    ("number (0..15)minutos (grain)", -3.028522096376982),
-                                    ("number (16..19 21..29)hora (grain)", -3.4339872044851463),
-                                    ("minute", -2.3353749158170367),
-                                    ("integer (numeric)a\241o (grain)", -3.4339872044851463),
-                                    ("number (0..15)semana (grain)", -3.028522096376982)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.890371757896165),
-                                    ("integer (numeric)hora (grain)", -2.890371757896165),
-                                    ("integer (numeric)dia (grain)", -2.890371757896165),
-                                    ("integer (numeric)mes (grain)", -3.295836866004329),
-                                    ("second", -2.890371757896165),
-                                    ("number (0..15)a\241o (grain)", -3.295836866004329),
-                                    ("integer (numeric)semana (grain)", -3.295836866004329),
-                                    ("integer (numeric)minutos (grain)", -2.890371757896165),
-                                    ("day", -2.890371757896165),
-                                    ("integer (numeric)segundo (grain)", -2.890371757896165),
-                                    ("year", -2.6026896854443837),
-                                    ("number (0..15)mes (grain)", -2.890371757896165),
-                                    ("hour", -2.890371757896165), ("month", -2.6026896854443837),
-                                    ("minute", -2.890371757896165),
-                                    ("integer (numeric)a\241o (grain)", -2.890371757896165),
-                                    ("number (0..15)semana (grain)", -3.295836866004329)],
-                               n = 16}}),
-       ("proximas n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)hora (grain)", -2.4849066497880004),
-                                    ("integer (numeric)dia (grain)", -2.4849066497880004),
-                                    ("second", -2.4849066497880004),
-                                    ("number (0..15)a\241o (grain)", -2.4849066497880004),
-                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
-                                    ("day", -2.4849066497880004),
-                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
-                                    ("year", -2.4849066497880004),
-                                    ("number (0..15)mes (grain)", -2.4849066497880004),
-                                    ("hour", -2.4849066497880004), ("month", -2.4849066497880004),
-                                    ("minute", -2.4849066497880004)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>", -1.252762968495368),
-                                    ("time-of-day (latent)", -1.252762968495368),
-                                    ("hour", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("n proximas <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("integer (numeric)mes (grain)", -1.791759469228055),
-                                    ("integer (numeric)semana (grain)", -1.791759469228055),
-                                    ("year", -1.791759469228055), ("month", -1.791759469228055),
-                                    ("integer (numeric)a\241o (grain)", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ano nuevo",
-        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}}),
-       ("la <cycle> pasado",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2039728043259361),
-                                    ("semana (grain)", -1.2039728043259361),
-                                    ("year", -1.6094379124341003),
-                                    ("a\241o (grain)", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("la pasado <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mes (grain)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods =
-                                 HashMap.fromList [("number (20..90)number (0..15)", 0.0)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day of month (1st)",
-        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}}),
-       ("a\241o (grain)",
-        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}}),
-       ("<hour-of-day> minus <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)number (0..15)", -1.252762968495368),
-                                    ("hour", -0.8472978603872037),
-                                    ("a las <time-of-day>number (0..15)", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month|named-day> next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("el <time>", -1.5040773967762742),
-                                    ("day", -0.8109302162163288),
-                                    ("named-day", -1.0986122886681098)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number (16..19 21..29)",
-        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}}),
-       ("<dim time> de la tarde",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> and half", -2.5902671654458267),
-                                    ("a las <time-of-day>", -1.6094379124341003),
-                                    ("<hour-of-day> and quarter", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -1.491654876777717), ("minute", -1.3862943611198906)],
-                               n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("el proximo <cycle> ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("semana (grain)", -1.540445040947149),
-                                    ("mes (grain)", -1.9459101490553135),
-                                    ("year", -1.9459101490553135),
-                                    ("a\241o (grain)", -1.9459101490553135),
-                                    ("month", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> minus quarter (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a las <time-of-day>", -1.2992829841302609),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the day after tomorrow",
-        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}}),
-       ("del <year>",
-        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}}),
-       ("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}}),
-       ("noon",
-        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}}),
-       ("evening",
-        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}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.252762968495368, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.9459101490553135),
-                                    ("dayday", -1.9459101490553135),
-                                    ("hh(:|.|h)mm (time-of-day)hh(:|.|h)mm (time-of-day)",
-                                     -1.9459101490553135),
-                                    ("<day-of-month> de <named-month><day-of-month> de <named-month>",
-                                     -1.9459101490553135)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.3364722366212129, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -2.3025850929940455),
-                                    ("dayyear", -1.8971199848858813),
-                                    ("named-month<day-of-month> de <named-month>",
-                                     -2.3025850929940455),
-                                    ("dd[/-]mmyear", -1.8971199848858813),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -1.8971199848858813),
-                                    ("minuteyear", -1.8971199848858813)],
-                               n = 5}}),
-       ("el <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2682639865946794),
-                                    ("number (0..15)", -1.4469189829363254)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -2.772588722239781, unseen = -1.3862943611198906,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -0.40546510810816444)],
-                               n = 1}}),
-       ("segundo (grain)",
-        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}}),
-       ("<named-month> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dia (grain)",
-        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}}),
-       ("in the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.3101549283038396, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("afternoon", -1.466337068793427),
-                                    ("hour", -0.7731898882334817), ("evening", -2.159484249353372),
-                                    ("morning", -1.6486586255873816)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.3217558399823195,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("afternoon", -1.3862943611198906),
-                                    ("hour", -0.8754687373538999),
-                                    ("morning", -1.3862943611198906)],
-                               n = 4}}),
-       ("morning",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("week-end",
-        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}}),
-       ("Nochevieja",
-        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}}),
-       ("hora (grain)",
-        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}}),
-       ("right now",
-        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}}),
-       ("Navidad",
-        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}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (numeric)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 5}}),
-       ("ce <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("season", -1.6094379124341003), ("day", -1.3217558399823195),
-                                    ("named-day", -2.0149030205422647),
-                                    ("hour", -1.6094379124341003),
-                                    ("week-end", -1.6094379124341003)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/ES_XX.hs b/Duckling/Ranking/Classifiers/ES_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ES_XX.hs
@@ -0,0 +1,1248 @@
+-- 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.ES_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("midnight",
+        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}}),
+       ("Martes",
+        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> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5839478885949533, unseen = -4.0943445622221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 58},
+                   koData =
+                     ClassData{prior = -0.8157495026522777, unseen = -3.871201010907891,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 46}}),
+       ("the day before yesterday",
+        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(:|.|h)mm (time-of-day)",
+        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}}),
+       ("<named-month|named-day> past",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martes", -1.791759469228055),
+                                    ("el <time>", -1.3862943611198906),
+                                    ("Domingo", -1.791759469228055), ("day", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Abril",
+        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[/-]mm",
+        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}}),
+       ("intersect by `de`",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -4.859812404361672,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Miercoleseste|en un <cycle>", -4.1588830833596715),
+                                    ("el <day-of-month> (non ordinal)intersect by `de`",
+                                     -3.7534179752515073),
+                                    ("daymonth", -1.807507826196194),
+                                    ("monthyear", -3.7534179752515073),
+                                    ("el <day-of-month> (non ordinal)Abril", -4.1588830833596715),
+                                    ("Marteseste|en un <cycle>", -4.1588830833596715),
+                                    ("Miercolesel <cycle> (proximo|que viene)",
+                                     -4.1588830833596715),
+                                    ("el <time>Marzo", -3.7534179752515073),
+                                    ("el <day-of-month> (non ordinal)Septiembre",
+                                     -4.1588830833596715),
+                                    ("Miercolesel proximo <cycle> ", -4.1588830833596715),
+                                    ("Luneseste|en un <cycle>", -4.1588830833596715),
+                                    ("dayyear", -2.2129729343043585),
+                                    ("dd-dd <month>(interval)year", -4.1588830833596715),
+                                    ("el <time>el <cycle> (proximo|que viene)",
+                                     -4.1588830833596715),
+                                    ("el <day-of-month> (non ordinal)Julio", -4.1588830833596715),
+                                    ("el <time>year", -3.7534179752515073),
+                                    ("Septiembreyear", -4.1588830833596715),
+                                    ("el <time>la <cycle> pasado", -4.1588830833596715),
+                                    ("day of month (1st)Marzo", -3.242592351485517),
+                                    ("el <day-of-month> de <named-month>year", -3.7534179752515073),
+                                    ("el <time>este|en un <cycle>", -3.7534179752515073),
+                                    ("Mayoyear", -4.1588830833596715),
+                                    ("<day-of-month> de <named-month>year", -3.7534179752515073),
+                                    ("two time tokens separated by \",\"year", -3.4657359027997265),
+                                    ("el <day-of-month> (non ordinal)Febrero", -4.1588830833596715),
+                                    ("two time tokens separated by \",\"intersect by `de`",
+                                     -4.1588830833596715),
+                                    ("dayweek", -2.4541349911212467),
+                                    ("intersect by `de`year", -3.4657359027997265),
+                                    ("el <day-of-month> (non ordinal)Marzo", -3.4657359027997265),
+                                    ("Domingola <cycle> pasado", -4.1588830833596715),
+                                    ("two time tokens separated by \",\"Septiembre",
+                                     -4.1588830833596715),
+                                    ("el <day-of-month> (non ordinal)Mayo", -3.4657359027997265)],
+                               n = 45},
+                   koData =
+                     ClassData{prior = -2.3025850929940455, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -3.1780538303479458),
+                                    ("Julioyear", -3.1780538303479458),
+                                    ("hourmonth", -2.772588722239781),
+                                    ("monthmonth", -3.1780538303479458),
+                                    ("a las <time-of-day>Julio", -3.1780538303479458),
+                                    ("dayyear", -3.1780538303479458),
+                                    ("<day-of-month> de <named-month>year", -3.1780538303479458),
+                                    ("a las <time-of-day>Enero", -3.1780538303479458),
+                                    ("de <datetime> - <datetime> (interval)Enero",
+                                     -3.1780538303479458)],
+                               n = 5}}),
+       ("n pasados <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..15)a\241o (grain)", -1.3862943611198906),
+                                    ("year", -1.3862943611198906),
+                                    ("number (0..15)mes (grain)", -1.3862943611198906),
+                                    ("month", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> and half",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>", -1.3217558399823195),
+                                    ("time-of-day (latent)", -1.3217558399823195),
+                                    ("hour", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("pasados n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.4849066497880004),
+                                    ("integer (numeric)dia (grain)", -2.4849066497880004),
+                                    ("integer (numeric)mes (grain)", -2.4849066497880004),
+                                    ("second", -2.4849066497880004),
+                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
+                                    ("day", -2.4849066497880004),
+                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
+                                    ("year", -2.4849066497880004), ("month", -2.4849066497880004),
+                                    ("minute", -2.4849066497880004),
+                                    ("integer (numeric)a\241o (grain)", -2.4849066497880004),
+                                    ("number (0..15)semana (grain)", -2.4849066497880004)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("semana (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}}),
+       ("two time tokens separated by \",\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Viernesintersect by `de`", -1.466337068793427),
+                                    ("dayday", -0.8602012652231115),
+                                    ("Viernesel <day-of-month> de <named-month>",
+                                     -2.5649493574615367),
+                                    ("Viernesel <time>", -2.159484249353372),
+                                    ("Lunes<day-of-month> de <named-month>", -2.5649493574615367),
+                                    ("Viernesel <day-of-month> (non ordinal)",
+                                     -2.5649493574615367)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> de la manana",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>", -1.3217558399823195),
+                                    ("time-of-day (latent)", -1.3217558399823195),
+                                    ("hour", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1}}),
+       ("del mediod\237a",
+        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}}),
+       ("Mayo",
+        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}}),
+       ("Jueves",
+        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> de <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..15)Marzo", -2.833213344056216),
+                                    ("integer (numeric)Abril", -2.833213344056216),
+                                    ("integer (numeric)Diciembre", -3.2386784521643803),
+                                    ("number (0..15)Mayo", -2.833213344056216),
+                                    ("integer (numeric)Enero", -3.2386784521643803),
+                                    ("integer (numeric)Marzo", -2.322387720290225),
+                                    ("integer (numeric)Febrero", -2.1400661634962708),
+                                    ("integer (numeric)Septiembre", -3.2386784521643803),
+                                    ("month", -0.8873031950009028),
+                                    ("integer (numeric)Mayo", -3.2386784521643803),
+                                    ("integer (numeric)Julio", -3.2386784521643803)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -2.3978952727983707, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -1.6094379124341003),
+                                    ("integer (numeric)Julio", -1.6094379124341003)],
+                               n = 2}}),
+       ("<time-of-day> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.3528213746227423, unseen = -4.31748811353631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> de <named-month>in the <part-of-day>",
+                                     -3.6109179126442243),
+                                    ("dayhour", -2.2246235515243336),
+                                    ("Lunesin the <part-of-day>", -3.6109179126442243),
+                                    ("tomorrowin the <part-of-day>", -3.6109179126442243),
+                                    ("a las <time-of-day>del mediod\237a", -3.6109179126442243),
+                                    ("el <day-of-month> de <named-month>in the <part-of-day>",
+                                     -3.6109179126442243),
+                                    ("hourhour", -2.2246235515243336),
+                                    ("a las <time-of-day>in the <part-of-day>",
+                                     -2.3581549441488563),
+                                    ("intersectin the <part-of-day>", -3.6109179126442243),
+                                    ("minutehour", -1.739115735742633),
+                                    ("intersect by `de`in the <part-of-day>", -3.6109179126442243),
+                                    ("<hour-of-day> and halfin the <part-of-day>",
+                                     -3.20545280453606),
+                                    ("<hour-of-day> and <relative minutes>del mediod\237a",
+                                     -3.20545280453606),
+                                    ("el <time>in the <part-of-day>", -3.6109179126442243),
+                                    ("<hour-of-day> and quarterin the <part-of-day>",
+                                     -2.6946271807700692),
+                                    ("yesterdayin the <part-of-day>", -3.6109179126442243),
+                                    ("time-of-day (latent)in the <part-of-day>",
+                                     -2.917770732084279)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.213022639845854, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -1.4816045409242156),
+                                    ("year (latent)del mediod\237a", -3.0910424533583156),
+                                    ("monthhour", -3.0910424533583156),
+                                    ("hourhour", -3.0910424533583156),
+                                    ("Febreroin the <part-of-day>", -3.0910424533583156),
+                                    ("year (latent)in the <part-of-day>", -1.5869650565820417),
+                                    ("time-of-day (latent)in the <part-of-day>",
+                                     -3.0910424533583156)],
+                               n = 11}}),
+       ("de <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.791759469228055),
+                                    ("monthyear", -1.791759469228055),
+                                    ("Diciembretime-of-day (latent)", -1.791759469228055),
+                                    ("monthhour", -1.791759469228055),
+                                    ("Diciembreyear (latent)", -1.791759469228055),
+                                    ("Diciembre<day-of-month> de <named-month>",
+                                     -1.791759469228055)],
+                               n = 3}}),
+       ("<time-of-day> horas",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>", -1.252762968495368),
+                                    ("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.7884573603642702),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.2113090936672069, unseen = -4.624972813284271,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> de <named-month>in the <part-of-day>",
+                                     -3.9219733362813143),
+                                    ("dayhour", -1.9760631872260008),
+                                    ("Lunesin the <part-of-day>", -3.9219733362813143),
+                                    ("tomorrowin the <part-of-day>", -3.9219733362813143),
+                                    ("el <day-of-month> de <named-month>in the <part-of-day>",
+                                     -3.9219733362813143),
+                                    ("hourhour", -3.005682604407159),
+                                    ("now<hour-of-day> minus quarter (as relative minutes)",
+                                     -3.9219733362813143),
+                                    ("dayyear", -3.005682604407159),
+                                    ("a las <time-of-day>in the <part-of-day>",
+                                     -2.6692103677859462),
+                                    ("intersectin the <part-of-day>", -3.9219733362813143),
+                                    ("<named-month> <day-of-month>del <year>", -3.9219733362813143),
+                                    ("minutehour", -2.312535423847214),
+                                    ("intersect by `de`in the <part-of-day>", -3.9219733362813143),
+                                    ("now<hour-of-day> and <relative minutes>",
+                                     -3.9219733362813143),
+                                    ("<hour-of-day> and halfin the <part-of-day>",
+                                     -3.5165082281731497),
+                                    ("tomorrowa las <time-of-day>", -3.5165082281731497),
+                                    ("Miercoles<time-of-day> <part-of-day>", -3.9219733362813143),
+                                    ("Miercoles<dim time> de la manana", -3.9219733362813143),
+                                    ("dayminute", -3.005682604407159),
+                                    ("<named-month> <day-of-month>el <time>", -3.9219733362813143),
+                                    ("Miercolesa las <time-of-day>", -3.9219733362813143),
+                                    ("el <time>in the <part-of-day>", -3.9219733362813143),
+                                    ("Miercolesintersect", -3.9219733362813143),
+                                    ("dd[/-]mmyear", -3.5165082281731497),
+                                    ("nowa las <time-of-day>", -3.5165082281731497),
+                                    ("<hour-of-day> and quarterin the <part-of-day>",
+                                     -3.005682604407159),
+                                    ("yesterdayin the <part-of-day>", -3.9219733362813143)],
+                               n = 34},
+                   koData =
+                     ClassData{prior = -1.6582280766035324, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.1986731175506815),
+                                    ("dayhour", -2.505525936990736),
+                                    ("<day-of-month> de <named-month>a las <time-of-day>",
+                                     -3.1986731175506815),
+                                    ("<time-of-day> am|pm<day-of-month> de <named-month>",
+                                     -3.1986731175506815),
+                                    ("monthhour", -2.793208009442517),
+                                    ("now<hour-of-day> and <relative minutes>",
+                                     -3.1986731175506815),
+                                    ("Diciembrea las <time-of-day>", -3.1986731175506815),
+                                    ("dayminute", -2.793208009442517),
+                                    ("Febreroin the <part-of-day>", -3.1986731175506815),
+                                    ("nowa las <time-of-day>", -2.505525936990736)],
+                               n = 8}}),
+       ("Miercoles",
+        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}}),
+       ("a las <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -4.634728988229636,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> and half", -3.2386784521643803),
+                                    ("<time-of-day> horas", -3.9318256327243257),
+                                    ("<hour-of-day> and quarter", -3.0155349008501706),
+                                    ("time-of-day (latent)", -1.2237754316221157),
+                                    ("<hour-of-day> and <relative minutes>", -2.833213344056216),
+                                    ("<time-of-day> am|pm", -3.9318256327243257),
+                                    ("<hour-of-day> minus <integer> (as relative minutes)",
+                                     -3.9318256327243257),
+                                    ("<hour-of-day> minus quarter (as relative minutes)",
+                                     -3.5263605246161616),
+                                    ("hour", -1.1592369104845446), ("minute", -1.8523840910444898)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -2.5257286443082556,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.791759469228055),
+                                    ("<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,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Lunes", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.1786549963416462),
+                                    ("number (0..15)", -0.6190392084062235),
+                                    ("number (20..90)", -1.8718021769015913)],
+                               n = 10}}),
+       ("Viernes",
+        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}}),
+       ("el <cycle> (proximo|que viene)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149),
+                                    ("semana (grain)", -1.540445040947149),
+                                    ("mes (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135),
+                                    ("a\241o (grain)", -1.9459101490553135),
+                                    ("month", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yesterday",
+        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}}),
+       ("<hour-of-day> and quarter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>", -1.4350845252893227),
+                                    ("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -0.7419373447293773)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dentro de <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hace <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8718021769015913), ("year", -1.8718021769015913),
+                                    ("<integer> <unit-of-duration>", -0.9555114450274363),
+                                    ("hour", -1.8718021769015913), ("month", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("el <day-of-month> de <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..15)Marzo", -2.6741486494265287),
+                                    ("integer (numeric)Abril", -2.6741486494265287),
+                                    ("number (0..15)Mayo", -2.268683541318364),
+                                    ("integer (numeric)Marzo", -2.268683541318364),
+                                    ("integer (numeric)Febrero", -2.6741486494265287),
+                                    ("integer (numeric)Septiembre", -2.6741486494265287),
+                                    ("month", -0.9694005571881036),
+                                    ("integer (numeric)Mayo", -2.6741486494265287),
+                                    ("integer (numeric)Julio", -2.6741486494265287)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("el <time>",
+        Classifier{okData =
+                     ClassData{prior = -2.7398974188114388e-2,
+                               unseen = -4.477336814478207,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martes", -3.367295829986474),
+                                    ("<named-month|named-day> past", -3.367295829986474),
+                                    ("dd[/-]mm", -3.079613757534693),
+                                    ("intersect by `de`", -2.268683541318364),
+                                    ("<day-of-month> de <named-month>", -2.068012845856213),
+                                    ("<time-of-day> <part-of-day>", -3.7727609380946383),
+                                    ("intersect", -3.7727609380946383),
+                                    ("Miercoles", -3.367295829986474),
+                                    ("Domingo", -3.367295829986474), ("Lunes", -3.7727609380946383),
+                                    ("day", -0.9395475940384223), ("year", -3.7727609380946383),
+                                    ("day of month (1st)", -3.367295829986474),
+                                    ("<named-month|named-day> next", -3.7727609380946383),
+                                    ("hour", -3.367295829986474)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -3.6109179126442243,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon", -2.1972245773362196), ("hour", -2.1972245773362196)],
+                               n = 1}}),
+       ("Septiembre",
+        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.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (primero..10)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("evening", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number (0..15)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Domingo",
+        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}}),
+       ("este|en un <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.0296194171811581),
+                                    ("semana (grain)", -1.0296194171811581),
+                                    ("year", -1.9459101490553135),
+                                    ("a\241o (grain)", -1.9459101490553135)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2006706954621511),
+                                    ("number (0..15)", -1.7047480922384253)],
+                               n = 9}}),
+       ("Lunes",
+        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}}),
+       ("dd-dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julio", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("mes (grain)",
+        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}}),
+       ("number (20..90)",
+        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}}),
+       ("<day-of-week> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("Juevesinteger (numeric)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.20359895524123955,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.1939224684724346),
+                                    ("number (0..15)", -0.3610133455373305)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -1.6916760106710724,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.587786664902119),
+                                    ("number (0..15)", -0.8109302162163288)],
+                               n = 7}}),
+       ("<hour-of-day> and <relative minutes>",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+                                     -2.1972245773362196),
+                                    ("time-of-day (latent)number (0..15)", -2.6026896854443837),
+                                    ("a las <time-of-day>number (20..90)", -2.1972245773362196),
+                                    ("a las <time-of-day>number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+                                     -2.1972245773362196),
+                                    ("hour", -0.8979415932059586),
+                                    ("a las <time-of-day>number (0..15)", -2.6026896854443837),
+                                    ("time-of-day (latent)number (20..90)", -2.1972245773362196)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>number (20..90)", -1.6094379124341003),
+                                    ("hour", -1.0986122886681098),
+                                    ("time-of-day (latent)number (20..90)", -1.6094379124341003)],
+                               n = 4}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 3}}),
+       ("en <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9444389791664407), ("second", -2.9444389791664407),
+                                    ("day", -2.538973871058276), ("year", -2.538973871058276),
+                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
+                                    ("hour", -2.2512917986064953), ("month", -2.9444389791664407),
+                                    ("minute", -1.845826690498331)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> (proximo|que viene)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("integer (numeric)semana (grain)", -1.791759469228055),
+                                    ("year", -1.791759469228055),
+                                    ("number (0..15)mes (grain)", -1.791759469228055),
+                                    ("month", -1.791759469228055),
+                                    ("integer (numeric)a\241o (grain)", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.587786664902119, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.028522096376982),
+                                    ("integer (numeric)hora (grain)", -3.4339872044851463),
+                                    ("integer (numeric)dia (grain)", -3.4339872044851463),
+                                    ("number (0..15)segundo (grain)", -3.4339872044851463),
+                                    ("second", -3.4339872044851463),
+                                    ("number (0..15)a\241o (grain)", -3.028522096376982),
+                                    ("integer (numeric)minutos (grain)", -2.740840023925201),
+                                    ("day", -3.028522096376982), ("year", -2.740840023925201),
+                                    ("number (0..15)mes (grain)", -3.028522096376982),
+                                    ("number (0..15)hora (grain)", -2.740840023925201),
+                                    ("hour", -2.3353749158170367), ("month", -3.028522096376982),
+                                    ("number (0..15)dia (grain)", -3.4339872044851463),
+                                    ("number (0..15)minutos (grain)", -3.028522096376982),
+                                    ("number (16..19 21..29)hora (grain)", -3.4339872044851463),
+                                    ("minute", -2.3353749158170367),
+                                    ("integer (numeric)a\241o (grain)", -3.4339872044851463),
+                                    ("number (0..15)semana (grain)", -3.028522096376982)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -4.007333185232471,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.890371757896165),
+                                    ("integer (numeric)hora (grain)", -2.890371757896165),
+                                    ("integer (numeric)dia (grain)", -2.890371757896165),
+                                    ("integer (numeric)mes (grain)", -3.295836866004329),
+                                    ("second", -2.890371757896165),
+                                    ("number (0..15)a\241o (grain)", -3.295836866004329),
+                                    ("integer (numeric)semana (grain)", -3.295836866004329),
+                                    ("integer (numeric)minutos (grain)", -2.890371757896165),
+                                    ("day", -2.890371757896165),
+                                    ("integer (numeric)segundo (grain)", -2.890371757896165),
+                                    ("year", -2.6026896854443837),
+                                    ("number (0..15)mes (grain)", -2.890371757896165),
+                                    ("hour", -2.890371757896165), ("month", -2.6026896854443837),
+                                    ("minute", -2.890371757896165),
+                                    ("integer (numeric)a\241o (grain)", -2.890371757896165),
+                                    ("number (0..15)semana (grain)", -3.295836866004329)],
+                               n = 16}}),
+       ("proximas n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)hora (grain)", -2.4849066497880004),
+                                    ("integer (numeric)dia (grain)", -2.4849066497880004),
+                                    ("second", -2.4849066497880004),
+                                    ("number (0..15)a\241o (grain)", -2.4849066497880004),
+                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
+                                    ("day", -2.4849066497880004),
+                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
+                                    ("year", -2.4849066497880004),
+                                    ("number (0..15)mes (grain)", -2.4849066497880004),
+                                    ("hour", -2.4849066497880004), ("month", -2.4849066497880004),
+                                    ("minute", -2.4849066497880004)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>", -1.252762968495368),
+                                    ("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1}}),
+       ("n proximas <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("integer (numeric)mes (grain)", -1.791759469228055),
+                                    ("integer (numeric)semana (grain)", -1.791759469228055),
+                                    ("year", -1.791759469228055), ("month", -1.791759469228055),
+                                    ("integer (numeric)a\241o (grain)", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ano nuevo",
+        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}}),
+       ("la <cycle> pasado",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2039728043259361),
+                                    ("semana (grain)", -1.2039728043259361),
+                                    ("year", -1.6094379124341003),
+                                    ("a\241o (grain)", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("la pasado <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mes (grain)", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("number (20..90)number (0..15)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day of month (1st)",
+        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}}),
+       ("Sabado",
+        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}}),
+       ("Diciembre",
+        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\241o (grain)",
+        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}}),
+       ("Julio",
+        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}}),
+       ("<hour-of-day> minus <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)number (0..15)", -1.252762968495368),
+                                    ("hour", -0.8472978603872037),
+                                    ("a las <time-of-day>number (0..15)", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month|named-day> next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martes", -1.6094379124341003),
+                                    ("Miercoles", -1.6094379124341003),
+                                    ("el <time>", -1.6094379124341003),
+                                    ("day", -0.916290731874155)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number (16..19 21..29)",
+        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}}),
+       ("<dim time> de la tarde",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> and half", -2.5902671654458267),
+                                    ("a las <time-of-day>", -1.6094379124341003),
+                                    ("<hour-of-day> and quarter", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -1.491654876777717), ("minute", -1.3862943611198906)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("el proximo <cycle> ",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149),
+                                    ("semana (grain)", -1.540445040947149),
+                                    ("mes (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135),
+                                    ("a\241o (grain)", -1.9459101490553135),
+                                    ("month", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> minus quarter (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a las <time-of-day>", -1.2992829841302609),
+                                    ("time-of-day (latent)", -1.2992829841302609),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the day after tomorrow",
+        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}}),
+       ("del <year>",
+        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}}),
+       ("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}}),
+       ("noon",
+        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}}),
+       ("evening",
+        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}}),
+       ("Febrero",
+        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}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.791759469228055),
+                                    ("dayday", -1.791759469228055),
+                                    ("hh(:|.|h)mm (time-of-day)hh(:|.|h)mm (time-of-day)",
+                                     -1.791759469228055),
+                                    ("<day-of-month> de <named-month><day-of-month> de <named-month>",
+                                     -1.791759469228055)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.9459101490553135),
+                                    ("dayyear", -1.540445040947149),
+                                    ("Diciembre<day-of-month> de <named-month>",
+                                     -1.9459101490553135),
+                                    ("dd[/-]mmyear", -1.540445040947149)],
+                               n = 3}}),
+       ("Enero",
+        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}}),
+       ("el <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2682639865946794),
+                                    ("number (0..15)", -1.4469189829363254)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.772588722239781, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -0.40546510810816444)],
+                               n = 1}}),
+       ("segundo (grain)",
+        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}}),
+       ("Marzo",
+        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}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -0.6931471805599453),
+                                    ("Mayointeger (numeric)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dia (grain)",
+        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}}),
+       ("in the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.3101549283038396, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -1.466337068793427),
+                                    ("hour", -0.7731898882334817), ("evening", -2.159484249353372),
+                                    ("morning", -1.6486586255873816)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.3217558399823195,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -1.3862943611198906),
+                                    ("hour", -0.8754687373538999),
+                                    ("morning", -1.3862943611198906)],
+                               n = 4}}),
+       ("morning",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("week-end",
+        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}}),
+       ("Nochevieja",
+        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}}),
+       ("hora (grain)",
+        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}}),
+       ("right now",
+        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}}),
+       ("Navidad",
+        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}}),
+       ("ce <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("season", -1.6094379124341003), ("Lunes", -2.0149030205422647),
+                                    ("day", -1.3217558399823195), ("hour", -1.6094379124341003),
+                                    ("week-end", -1.6094379124341003)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/ET.hs b/Duckling/Ranking/Classifiers/ET.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/ET.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.ET (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/ET_XX.hs b/Duckling/Ranking/Classifiers/ET_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ET_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.ET_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/FR.hs b/Duckling/Ranking/Classifiers/FR.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/FR.hs
+++ /dev/null
@@ -1,2601 +0,0 @@
--- 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.FR (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("n derniers <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.803360380906535),
-                                    ("number (0..16)seconde (grain)", -2.803360380906535),
-                                    ("number (0..16)jour (grain)", -2.803360380906535),
-                                    ("second", -2.3978952727983707),
-                                    ("integer (numeric)ann\233e (grain)", -2.803360380906535),
-                                    ("integer (numeric)seconde (grain)", -2.803360380906535),
-                                    ("number (0..16)minute (grain)", -2.803360380906535),
-                                    ("integer (numeric)jour (grain)", -2.803360380906535),
-                                    ("day", -2.3978952727983707), ("year", -2.803360380906535),
-                                    ("month", -2.803360380906535),
-                                    ("integer (numeric)minute (grain)", -2.803360380906535),
-                                    ("integer (numeric)mois (grain)", -2.803360380906535),
-                                    ("minute", -2.3978952727983707),
-                                    ("integer (numeric)semaine (grain)", -2.803360380906535)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month> prochain",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2}}),
-       ("du|dans le <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("soir", -1.3862943611198906),
-                                    ("apr\232s-midi", -2.174751721484161),
-                                    ("matin", -1.8382794848629478), ("hour", -0.7396671961948381)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -0.8109302162163288,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("soir", -2.1972245773362196),
-                                    ("apr\232s-midi", -2.1972245773362196),
-                                    ("matin", -1.1856236656577395), ("hour", -0.750305594399894)],
-                               n = 16}}),
-       ("dans <duration>",
-        Classifier{okData =
-                     ClassData{prior = -8.338160893905101e-2,
-                               unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("<integer> + '\"", -2.9267394020670396),
-                                    ("second", -2.639057329615259), ("day", -2.9267394020670396),
-                                    ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -1.1921383466789333),
-                                    ("une <unit-of-duration>", -2.2335922215070942),
-                                    ("hour", -2.4159137783010487), ("month", -3.332204510175204),
-                                    ("minute", -1.9459101490553135)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -2.5257286443082556, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.9459101490553135), ("day", -1.9459101490553135),
-                                    ("une <unit-of-duration>", -1.540445040947149)],
-                               n = 2}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>", -1.5040773967762742),
-                                    ("hour", -0.8109302162163288),
-                                    ("<time-of-day> heures", -1.0986122886681098)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("n <cycle> apr\232s",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..16)jour (grain)", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.4793738175333202, unseen = -5.484796933490655,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 239},
-                   koData =
-                     ClassData{prior = -0.9654047826860945, unseen = -5.003946305945459,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 147}}),
-       ("<named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("apr\232s le travail",
-        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}}),
-       ("n prochains <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.833213344056216),
-                                    ("number (0..16)seconde (grain)", -2.833213344056216),
-                                    ("second", -2.4277482359480516),
-                                    ("integer (numeric)ann\233e (grain)", -2.833213344056216),
-                                    ("integer (numeric)seconde (grain)", -2.833213344056216),
-                                    ("number (0..16)minute (grain)", -2.833213344056216),
-                                    ("integer (numeric)jour (grain)", -2.833213344056216),
-                                    ("day", -2.833213344056216), ("year", -2.833213344056216),
-                                    ("hour", -2.833213344056216), ("month", -2.833213344056216),
-                                    ("integer (numeric)minute (grain)", -2.833213344056216),
-                                    ("integer (numeric)mois (grain)", -2.833213344056216),
-                                    ("minute", -2.4277482359480516),
-                                    ("integer (numeric)semaine (grain)", -2.833213344056216),
-                                    ("integer (numeric)heure (grain)", -2.833213344056216)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fin d'ann\233e",
-        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-week> <day-of-month> \224 <time-of-day>)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.7827593392496325),
-                                    ("named-dayinteger (numeric)\224|vers <time-of-day>",
-                                     -1.6094379124341003),
-                                    ("named-daynumber (0..16)<time-of-day> heures",
-                                     -2.456735772821304),
-                                    ("named-dayinteger (numeric)<time-of-day> heures",
-                                     -2.169053700369523),
-                                    ("named-daynumber (0..16)\224|vers <time-of-day>",
-                                     -1.9459101490553135)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("apr\232s le d\233jeuner",
-        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}}),
-       ("<named-day> en quinze",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("entre <datetime> et <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("le <time>le <day-of-month> (non ordinal)",
-                                     -3.417726683613366),
-                                    ("le <time>le <time>", -3.012261575505202),
-                                    ("dayday", -1.7129785913749407),
-                                    ("hourhour", -3.417726683613366),
-                                    ("le <time>intersect", -3.417726683613366),
-                                    ("miditime-of-day (latent)", -3.417726683613366),
-                                    ("intersectle <day-of-month> (non ordinal)",
-                                     -3.417726683613366),
-                                    ("minutehour", -1.7129785913749407),
-                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
-                                     -3.012261575505202),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -2.7245795030534206),
-                                    ("le <day-of-month> (non ordinal)le <day-of-month> (non ordinal)",
-                                     -3.012261575505202),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -2.7245795030534206),
-                                    ("intersectintersect", -3.417726683613366),
-                                    ("intersectle <time>", -3.012261575505202),
-                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
-                                     -3.012261575505202)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
-                                     -2.740840023925201),
-                                    ("dayday", -2.3353749158170367),
-                                    ("le <day-of-month> (non ordinal)intersect",
-                                     -2.740840023925201),
-                                    ("minutehour", -1.824549292051046),
-                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
-                                     -2.740840023925201),
-                                    ("le <day-of-month> (non ordinal)le <time>",
-                                     -2.740840023925201),
-                                    ("hh(:|h)mm (time-of-day)intersect", -2.740840023925201),
-                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
-                                     -2.740840023925201)],
-                               n = 6}}),
-       ("soir",
-        Classifier{okData =
-                     ClassData{prior = -0.1823215567939546, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("ann\233e (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}}),
-       ("d\233but de semaine",
-        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}}),
-       ("<hour-of-day> moins <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midinumber (0..16)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month|named-day> suivant|d'apr\232s",
-        Classifier{okData =
-                     ClassData{prior = -0.10178269430994236,
-                               unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.5494451709255714),
-                                    ("en semaine", -1.9616585060234524),
-                                    ("intersect by 'de' or ','", -2.5494451709255714),
-                                    ("day", -0.7915872533731978),
-                                    ("named-day", -2.5494451709255714),
-                                    ("le <time>", -1.9616585060234524)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -2.3353749158170367, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("en semaine", -1.9459101490553135),
-                                    ("day", -1.540445040947149), ("hour", -1.9459101490553135),
-                                    ("<time-of-day> heures", -1.9459101490553135),
-                                    ("le <time>", -1.9459101490553135)],
-                               n = 3}}),
-       ("seconde (grain)",
-        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}}),
-       ("<hour-of-day> et|pass\233 de <number>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>number (20..60)", -2.3513752571634776),
-                                    ("<time-of-day> heuresinteger (numeric)", -2.3513752571634776),
-                                    ("\224|vers <time-of-day>number (0..16)", -2.3513752571634776),
-                                    ("hour", -0.9650808960435872),
-                                    ("<time-of-day> heuresnumber (20..60)", -1.9459101490553135),
-                                    ("<time-of-day> heuresnumber (0..16)", -1.9459101490553135)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midiinteger (numeric)", -1.5040773967762742),
-                                    ("hour", -1.5040773967762742)],
-                               n = 1}}),
-       ("<hour-of-day> moins quart",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midi", -0.6931471805599453), ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("de <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
-                                     -2.6855773452501515),
-                                    ("minuteminute", -1.5869650565820417),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -3.0910424533583156),
-                                    ("<time-of-day> heures<time-of-day> heures",
-                                     -3.0910424533583156),
-                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
-                                     -2.6855773452501515),
-                                    ("hourhour", -2.3978952727983707),
-                                    ("minutehour", -2.174751721484161),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -2.3978952727983707),
-                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
-                                     -2.6855773452501515),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -3.0910424533583156),
-                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
-                                     -2.6855773452501515),
-                                    ("<time-of-day> heurestime-of-day (latent)",
-                                     -3.0910424533583156)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -0.8109302162163288,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minutehour", -1.072636802264849),
-                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
-                                     -2.2512917986064953),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -2.538973871058276),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -2.538973871058276),
-                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
-                                     -1.845826690498331)],
-                               n = 12}}),
-       ("<datetime>-dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.466337068793427, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.3217558399823195),
-                                    ("<day-of-month> <named-month>named-month",
-                                     -1.6094379124341003),
-                                    ("day of month (premier)named-month", -2.0149030205422647)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.262364264467491, unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourmonth", -1.7578579175523736),
-                                    ("named-monthnamed-month", -2.268683541318364),
-                                    ("monthmonth", -2.268683541318364),
-                                    ("year (latent)named-month", -1.7578579175523736),
-                                    ("yearmonth", -1.7578579175523736),
-                                    ("time-of-day (latent)named-month", -1.7578579175523736)],
-                               n = 10}}),
-       ("semaine (grain)",
-        Classifier{okData =
-                     ClassData{prior = -7.79615414697118e-2,
-                               unseen = -3.6635616461296463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
-                   koData =
-                     ClassData{prior = -2.5902671654458267,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("demain",
-        Classifier{okData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -1.0116009116784799, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("mois (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}}),
-       ("intersect by 'mais/par exemple/plut\244t'",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.3978952727983707),
-                                    ("named-dayentre <time-of-day> et <time-of-day> (interval)",
-                                     -1.5869650565820417),
-                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
-                                     -3.0910424533583156),
-                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
-                                     -2.6855773452501515),
-                                    ("dayminute", -0.9509762898620451),
-                                    ("named-dayentre <datetime> et <datetime> (interval)",
-                                     -1.5869650565820417)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("de <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.410986973710262, unseen = -4.143134726391533,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day of month (premier)<day-of-week> <day-of-month>",
-                                     -3.4339872044851463),
-                                    ("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
-                                     -3.4339872044851463),
-                                    ("minuteminute", -2.517696472610991),
-                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
-                                     -3.4339872044851463),
-                                    ("dayday", -2.517696472610991),
-                                    ("<day-of-month> <named-month>day of month (premier)",
-                                     -3.4339872044851463),
-                                    ("minutehour", -3.028522096376982),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -3.4339872044851463),
-                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
-                                     -3.4339872044851463),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -3.4339872044851463),
-                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
-                                     -3.4339872044851463),
-                                    ("<day-of-month> <named-month>intersect", -3.4339872044851463),
-                                    ("intersect<day-of-week> <day-of-month>", -3.4339872044851463)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.27958486221916157,
-                               unseen = -4.653960350157523,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
-                                     -3.951243718581427),
-                                    ("<day-of-month> <named-month>time-of-day (latent)",
-                                     -3.951243718581427),
-                                    ("hourday", -3.0349529867072724),
-                                    ("dayhour", -3.951243718581427),
-                                    ("yearhour", -3.951243718581427),
-                                    ("intersectnamed-day", -3.951243718581427),
-                                    ("time-of-day (latent)year (latent)", -3.951243718581427),
-                                    ("houryear", -3.951243718581427),
-                                    ("day of month (premier)named-day", -3.951243718581427),
-                                    ("time-of-day (latent)intersect", -3.545778610473263),
-                                    ("year (latent)intersect", -3.545778610473263),
-                                    ("yearyear", -3.951243718581427),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -3.951243718581427),
-                                    ("dayday", -2.2464956263430023),
-                                    ("year (latent)year (latent)", -3.951243718581427),
-                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
-                                     -3.951243718581427),
-                                    ("hourhour", -3.951243718581427),
-                                    ("time-of-day (latent)<day-of-week> <day-of-month>",
-                                     -3.951243718581427),
-                                    ("minutehour", -2.4471663218051534),
-                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
-                                     -3.545778610473263),
-                                    ("year (latent)<day-of-week> <day-of-month>",
-                                     -3.951243718581427),
-                                    ("year (latent)time-of-day (latent)", -3.951243718581427),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -3.951243718581427),
-                                    ("year (latent)named-day", -3.951243718581427),
-                                    ("time-of-day (latent)named-day", -3.951243718581427),
-                                    ("day of month (premier)intersect", -3.545778610473263),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -3.951243718581427),
-                                    ("intersectintersect", -3.545778610473263),
-                                    ("hh(:|h)mm (time-of-day)intersect", -3.951243718581427),
-                                    ("yearday", -3.0349529867072724),
-                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
-                                     -3.545778610473263),
-                                    ("<day-of-week> <day-of-month>named-day", -3.951243718581427),
-                                    ("<day-of-week> <day-of-month>intersect", -3.545778610473263)],
-                               n = 31}}),
-       ("<ordinal> <cycle> de <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7346010553881064),
-                                    ("ordinals (premier..seizieme)semaine (grain)named-month",
-                                     -1.7346010553881064),
-                                    ("ordinal (digits)jour (grain)named-month",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.2237754316221157),
-                                    ("ordinals (premier..seizieme)semaine (grain)intersect",
-                                     -1.7346010553881064)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("premi\232re quinzaine de <named-month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("n <cycle> suivants",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -1.6094379124341003), ("month", -1.6094379124341003),
-                                    ("integer (numeric)mois (grain)", -1.6094379124341003),
-                                    ("integer (numeric)heure (grain)", -1.6094379124341003)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..16)jour (grain)", -1.2039728043259361),
-                                    ("day", -1.2039728043259361)],
-                               n = 2}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.24867991464851183,
-                               unseen = -7.182352111885263,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("apr\232s <time-of-day>named-month", -5.795297583491974),
-                                    ("<day-of-month> <named-month><dim time> <part-of-day>",
-                                     -6.082979655943755),
-                                    ("intersect<dim time> du matin", -6.082979655943755),
-                                    ("<hour-of-day> <integer> (as relative minutes)intersect",
-                                     -6.082979655943755),
-                                    ("hh(:|h)mm (time-of-day)named-day", -6.082979655943755),
-                                    ("<day-of-month> <named-month>d\233but de journ\233e",
-                                     -6.48844476405192),
-                                    ("demain<time-of-day> heures", -6.082979655943755),
-                                    ("hourday", -4.237152965445424),
-                                    ("<day-of-month> <named-month>year", -5.795297583491974),
-                                    ("dayhour", -1.6132474408507682),
-                                    ("daymonth", -3.070718080438554),
-                                    ("monthyear", -4.984367367275645),
-                                    ("<day-of-month> <named-month>d\233but de matin\233e",
-                                     -6.48844476405192),
-                                    ("dernier <cycle> de <time> (latent)year", -5.572154032177765),
-                                    ("aujourd'huimilieu d'apr\232s-midi", -6.48844476405192),
-                                    ("named-month<dim time> du matin", -6.082979655943755),
-                                    ("<day-of-month> <named-month>\224|vers <time-of-day>",
-                                     -4.348378600555649),
-                                    ("dd mmyear", -5.235681795556552),
-                                    ("named-monthd\233but d'apr\232s-midi", -6.48844476405192),
-                                    ("aujourd'huifin d'apr\232s-midi", -6.48844476405192),
-                                    ("le <day-of-month> (non ordinal)<dim time> du matin",
-                                     -6.082979655943755),
-                                    ("named-monthd\233but de matin\233e", -6.48844476405192),
-                                    ("aujourd'huimilieu de matin\233e", -6.48844476405192),
-                                    ("hh(:|h)mm (time-of-day)<day-of-week> <day-of-month>",
-                                     -6.48844476405192),
-                                    ("named-month\224|vers <time-of-day>", -5.235681795556552),
-                                    ("named-dayday of month (premier)", -5.795297583491974),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -4.984367367275645),
-                                    ("named-monthd\233but de soir\233e", -6.48844476405192),
-                                    ("<hour-of-day> et quart<dim time> <part-of-day>",
-                                     -5.795297583491974),
-                                    ("<day-of-week> <day-of-month>named-month", -5.795297583491974),
-                                    ("le <time>du|dans le <part-of-day>", -5.572154032177765),
-                                    ("aujourd'huifin de matin\233e", -6.48844476405192),
-                                    ("aujourd'huifin de soir\233e", -6.48844476405192),
-                                    ("\224|vers <time-of-day>ce <part-of-day>", -5.795297583491974),
-                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
-                                     -6.48844476405192),
-                                    ("le <day-of-month> (non ordinal)<dim time> du soir",
-                                     -5.235681795556552),
-                                    ("named-monthmilieu de matin\233e", -6.48844476405192),
-                                    ("aujourd'huid\233but de soir\233e", -6.48844476405192),
-                                    ("named-monthfin de soir\233e", -6.48844476405192),
-                                    ("entre <datetime> et <datetime> (interval)named-day",
-                                     -6.082979655943755),
-                                    ("<hour-of-day> et demice <part-of-day>", -5.795297583491974),
-                                    ("le <time>fin de matin\233e", -6.48844476405192),
-                                    ("intersectmilieu de journ\233e", -6.48844476405192),
-                                    ("intersectfin de journ\233e", -6.48844476405192),
-                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
-                                     -4.879006851617819),
-                                    ("<hour-of-day> <integer> (as relative minutes)<day-of-week> <day-of-month>",
-                                     -6.48844476405192),
-                                    ("le <day-of-month> (non ordinal)named-month",
-                                     -3.923495406590383),
-                                    ("monthhour", -3.8857550786075357),
-                                    ("le <time><time-of-day> heures", -5.38983247538381),
-                                    ("le <time>fin d'apr\232s-midi", -6.48844476405192),
-                                    ("hourmonth", -4.984367367275645),
-                                    ("named-monthmilieu d'apr\232s-midi", -6.48844476405192),
-                                    ("<time-of-day> heuresle <time>", -4.984367367275645),
-                                    ("dayday", -4.137069506888442),
-                                    ("aujourd'hui<hour-of-day> <integer> (as relative minutes)",
-                                     -5.795297583491974),
-                                    ("apr\232s <time-of-day>named-day", -6.082979655943755),
-                                    ("named-dayle <cycle> prochain|suivant|d'apr\232s",
-                                     -5.102150402932029),
-                                    ("named-dayapr\232s <time-of-day>", -5.38983247538381),
-                                    ("hourhour", -3.4680198779075573),
-                                    ("<day-of-week> <day-of-month>\224|vers <time-of-day>",
-                                     -4.783696671813495),
-                                    ("le <time>intersect", -5.795297583491974),
-                                    ("\224|vers <time-of-day><dim time> <part-of-day>",
-                                     -6.48844476405192),
-                                    ("aujourd'huiau d\233jeuner", -6.48844476405192),
-                                    ("<time-of-day> heuresintersect", -5.572154032177765),
-                                    ("intersectnamed-month", -4.879006851617819),
-                                    ("intersect<time-of-day> heures", -5.795297583491974),
-                                    ("<hour-of-day> et quartce <part-of-day>", -5.795297583491974),
-                                    ("dayyear", -4.090549491253549),
-                                    ("named-dayce|dans le <cycle>", -5.795297583491974),
-                                    ("apr\232s-demain\224|vers <time-of-day>", -5.572154032177765),
-                                    ("intersectfin d'apr\232s-midi", -6.48844476405192),
-                                    ("le <ordinal> <cycle> de <time>year", -6.48844476405192),
-                                    ("intersectmilieu d'apr\232s-midi", -6.48844476405192),
-                                    ("named-monthfin de journ\233e", -6.48844476405192),
-                                    ("le <time>milieu de journ\233e", -6.48844476405192),
-                                    ("aujourd'huid\233but de journ\233e", -6.48844476405192),
-                                    ("demain\224|vers <time-of-day>", -5.572154032177765),
-                                    ("le <day-of-month> (non ordinal)intersect",
-                                     -3.544005784885479),
-                                    ("hourminute", -6.48844476405192),
-                                    ("dd-dd <month>(interval)year", -6.48844476405192),
-                                    ("intersect<day-of-month> <named-month>", -6.082979655943755),
-                                    ("minutemonth", -6.082979655943755),
-                                    ("\224|vers <time-of-day>demain", -6.48844476405192),
-                                    ("minutehour", -4.616642587150328),
-                                    ("named-daydu|dans le <part-of-day>", -6.082979655943755),
-                                    ("aujourd'huimilieu de journ\233e", -6.48844476405192),
-                                    ("named-monthyear", -4.984367367275645),
-                                    ("intersectd\233but de soir\233e", -6.48844476405192),
-                                    ("entre <datetime> et <datetime> (interval)named-month",
-                                     -6.48844476405192),
-                                    ("aujourd'huifin de journ\233e", -6.48844476405192),
-                                    ("intersectdu|dans le <part-of-day>", -4.137069506888442),
-                                    ("le <day-of-month> \224 <datetime>du|dans le <part-of-day>",
-                                     -6.082979655943755),
-                                    ("named-monthd\233but de journ\233e", -6.48844476405192),
-                                    ("named-month<dim time> <part-of-day>", -6.082979655943755),
-                                    ("le <day-of-month> (non ordinal)apr\232s <time-of-day>",
-                                     -6.48844476405192),
-                                    ("named-day<day-of-month> <named-month>", -5.795297583491974),
-                                    ("named-dayle <time>", -4.348378600555649),
-                                    ("le <day-of-month> (non ordinal)<dim time> <part-of-day>",
-                                     -4.090549491253549),
-                                    ("dd/-mm<time-of-day> heures", -6.082979655943755),
-                                    ("de <datetime> - <datetime> (interval)named-month",
-                                     -6.082979655943755),
-                                    ("apr\232s <time-of-day>le <time>", -5.572154032177765),
-                                    ("named-day<time-of-day> heures", -5.795297583491974),
-                                    ("intersectd\233but d'apr\232s-midi", -6.48844476405192),
-                                    ("named-dayfin d'apr\232s-midi", -6.082979655943755),
-                                    ("<hour-of-day> et quartdemain", -5.795297583491974),
-                                    ("<time-of-day> heuresce <time>", -6.48844476405192),
-                                    ("le <time>d\233but d'apr\232s-midi", -6.48844476405192),
-                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
-                                     -6.082979655943755),
-                                    ("named-dayintersect", -6.48844476405192),
-                                    ("le <time><dim time> du matin", -6.082979655943755),
-                                    ("apr\232s <time-of-day>intersect", -6.082979655943755),
-                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
-                                     -4.542534614996606),
-                                    ("<day-of-month> <named-month>d\233but de soir\233e",
-                                     -6.48844476405192),
-                                    ("hierdu|dans le <part-of-day>", -6.48844476405192),
-                                    ("le <time>d\233but de soir\233e", -6.48844476405192),
-                                    ("intersect<dim time> <part-of-day>", -6.082979655943755),
-                                    ("dayminute", -4.783696671813495),
-                                    ("intersectd\233but de journ\233e", -6.48844476405192),
-                                    ("<ordinal> <cycle> de <time>year", -6.082979655943755),
-                                    ("le <time>\224|vers <time-of-day>", -4.783696671813495),
-                                    ("<day-of-month> <named-month><dim time> du matin",
-                                     -6.082979655943755),
-                                    ("intersectyear", -5.795297583491974),
-                                    ("<day-of-week> <day-of-month><time-of-day> heures",
-                                     -5.38983247538381),
-                                    ("minuteday", -3.5180302984822185),
-                                    ("le <time>d\233but de matin\233e", -6.48844476405192),
-                                    ("<datetime> - <datetime> (interval)named-month",
-                                     -5.235681795556552),
-                                    ("<day-of-month> <named-month><time-of-day> heures",
-                                     -4.984367367275645),
-                                    ("aujourd'hui\224|vers <time-of-day>", -5.572154032177765),
-                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
-                                     -6.48844476405192),
-                                    ("day of month (premier)intersect", -6.48844476405192),
-                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
-                                     -6.48844476405192),
-                                    ("entre <time-of-day> et <time-of-day> (interval)named-day",
-                                     -6.082979655943755),
-                                    ("named-monthfin de matin\233e", -6.48844476405192),
-                                    ("named-day<named-month|named-day> suivant|d'apr\232s",
-                                     -5.572154032177765),
-                                    ("le <time>milieu de matin\233e", -6.48844476405192),
-                                    ("aujourd'huid\233but de matin\233e", -5.38983247538381),
-                                    ("<dim time> <part-of-day>apr\232s <time-of-day>",
-                                     -6.48844476405192),
-                                    ("le <time>fin de soir\233e", -6.48844476405192),
-                                    ("<day-of-month> <named-month>milieu de matin\233e",
-                                     -6.48844476405192),
-                                    ("<day-of-month> <named-month>fin de soir\233e",
-                                     -6.48844476405192),
-                                    ("named-month<time-of-day> heures", -5.795297583491974),
-                                    ("<day-of-month> <named-month>fin de matin\233e",
-                                     -6.48844476405192),
-                                    ("<time-of-day> heuresce <part-of-day>", -5.795297583491974),
-                                    ("named-monthfin d'apr\232s-midi", -6.48844476405192),
-                                    ("le <time>named-month", -5.235681795556552),
-                                    ("apr\232s le <day-of-month>named-month", -6.48844476405192),
-                                    ("aujourd'huid\233but d'apr\232s-midi", -6.48844476405192),
-                                    ("le <time>milieu d'apr\232s-midi", -6.48844476405192),
-                                    ("\224|vers <time-of-day>du|dans le <part-of-day>",
-                                     -5.38983247538381),
-                                    ("intersectintersect", -6.082979655943755),
-                                    ("de <time-of-day> - <time-of-day> (interval)named-day",
-                                     -5.572154032177765),
-                                    ("de <datetime> - <datetime> (interval)named-day",
-                                     -6.082979655943755),
-                                    ("named-dayde <time-of-day> - <time-of-day> (interval)",
-                                     -6.082979655943755),
-                                    ("dayweek", -4.2912201867157), ("weekyear", -5.102150402932029),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-day",
-                                     -6.082979655943755),
-                                    ("hh(:|h)mm (time-of-day)intersect", -6.082979655943755),
-                                    ("named-monthintersect", -6.082979655943755),
-                                    ("<day-of-month> <named-month>fin de journ\233e",
-                                     -6.48844476405192),
-                                    ("<day-of-month> <named-month>milieu de journ\233e",
-                                     -6.48844476405192),
-                                    ("le <time>fin de journ\233e", -6.48844476405192),
-                                    ("dd/-mm\224|vers <time-of-day>", -5.572154032177765),
-                                    ("intersectfin de matin\233e", -6.48844476405192),
-                                    ("day of month (premier)named-month", -4.696685294823864),
-                                    ("named-day\224|vers <time-of-day>", -5.102150402932029),
-                                    ("named-monthmilieu de journ\233e", -6.48844476405192),
-                                    ("<day-of-month> <named-month>intersect", -6.082979655943755),
-                                    ("intersectfin de soir\233e", -6.48844476405192),
-                                    ("intersectmilieu de matin\233e", -6.48844476405192),
-                                    ("intersect\224|vers <time-of-day>", -5.235681795556552),
-                                    ("le <time>year", -4.984367367275645),
-                                    ("le <time><dim time> <part-of-day>", -6.082979655943755),
-                                    ("<time-of-day> - <time-of-day> (interval)named-day",
-                                     -5.235681795556552),
-                                    ("apr\232s-demain<time-of-day> heures", -6.082979655943755),
-                                    ("le <time>d\233but de journ\233e", -6.48844476405192),
-                                    ("intersectd\233but de matin\233e", -6.48844476405192),
-                                    ("<datetime> - <datetime> (interval)named-day",
-                                     -5.572154032177765)],
-                               n = 549},
-                   koData =
-                     ClassData{prior = -1.5133532392387958, unseen = -6.269096283706261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
-                                     -5.574053367981417),
-                                    ("hh(:|h)mm (time-of-day)named-day", -5.574053367981417),
-                                    ("year<time-of-day> - <time-of-day> (interval)",
-                                     -4.880906187421472),
-                                    ("demain<time-of-day> heures", -4.880906187421472),
-                                    ("hourday", -3.2226781108179394),
-                                    ("<day-of-month> <named-month>year", -5.574053367981417),
-                                    ("demainavant <time-of-day>", -5.574053367981417),
-                                    ("dayhour", -2.529530930257994),
-                                    ("le lendemain du <time>named-month", -5.574053367981417),
-                                    ("daymonth", -3.9646154555473165),
-                                    ("monthday", -5.574053367981417),
-                                    ("monthyear", -4.880906187421472),
-                                    ("yearhour", -4.880906187421472),
-                                    ("houryear", -5.168588259873252),
-                                    ("aujourd'hui<time-of-day> heures", -5.574053367981417),
-                                    ("named-month\224|vers <time-of-day>", -3.8693052757429918),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -4.880906187421472),
-                                    ("<day-of-week> <day-of-month>named-month", -4.187759006861526),
-                                    ("le <time>du|dans le <part-of-day>", -5.168588259873252),
-                                    ("le <day-of-month> (non ordinal)<hour-of-day> <integer> (as relative minutes)",
-                                     -4.880906187421472),
-                                    ("named-month<day-of-month> <named-month>", -5.574053367981417),
-                                    ("<time-of-day> heuresle <day-of-month> (non ordinal)",
-                                     -4.657762636107262),
-                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
-                                     -5.574053367981417),
-                                    ("aujourd'huidu|dans le <part-of-day>", -5.168588259873252),
-                                    ("le <day-of-month> (non ordinal)named-month",
-                                     -5.574053367981417),
-                                    ("monthhour", -3.3768287906451975),
-                                    ("hourmonth", -4.321290399486049),
-                                    ("dayday", -3.782293898753362),
-                                    ("named-dayapr\232s <time-of-day>", -4.880906187421472),
-                                    ("hourhour", -3.9646154555473165),
-                                    ("named-day<hour-of-day> <integer> (as relative minutes)",
-                                     -4.657762636107262),
-                                    ("dayyear", -4.321290399486049),
-                                    ("le <cycle> de <time>named-month", -5.168588259873252),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -4.880906187421472),
-                                    ("demain\224|vers <time-of-day>", -4.657762636107262),
-                                    ("<dim time> <part-of-day><hour-of-day> <integer> (as relative minutes)",
-                                     -5.168588259873252),
-                                    ("hourminute", -5.168588259873252),
-                                    ("minutemonth", -4.880906187421472),
-                                    ("named-monthyear", -4.880906187421472),
-                                    ("intersect by 'de' or ','year", -5.168588259873252),
-                                    ("named-day<time-of-day> - <time-of-day> (interval)",
-                                     -3.8693052757429918),
-                                    ("named-day<datetime> - <datetime> (interval)",
-                                     -5.168588259873252),
-                                    ("named-day<day-of-month> <named-month>", -4.187759006861526),
-                                    ("weekmonth", -5.168588259873252),
-                                    ("named-dayle <time>", -5.168588259873252),
-                                    ("avant <time-of-day>named-day", -5.574053367981417),
-                                    ("de <datetime> - <datetime> (interval)named-month",
-                                     -5.574053367981417),
-                                    ("le <day-of-month> (non ordinal)year", -5.168588259873252),
-                                    ("named-day<time-of-day> heures", -5.168588259873252),
-                                    ("<time-of-day> heuresnamed-day", -4.069975971205143),
-                                    ("apr\232s <time-of-day><time-of-day> heures",
-                                     -5.168588259873252),
-                                    ("<time-of-day> heuresdd/-mm", -5.574053367981417),
-                                    ("<time-of-day> - <time-of-day> (interval)du|dans le <part-of-day>",
-                                     -5.168588259873252),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -5.168588259873252),
-                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
-                                     -4.880906187421472),
-                                    ("dayminute", -4.187759006861526),
-                                    ("named-monthdu|dans le <part-of-day>", -5.168588259873252),
-                                    ("intersectyear", -5.168588259873252),
-                                    ("minuteday", -4.880906187421472),
-                                    ("aujourd'hui\224|vers <time-of-day>", -4.880906187421472),
-                                    ("<datetime>-dd <month>(interval)year", -5.168588259873252),
-                                    ("<time-of-day> - <time-of-day> (interval)named-month",
-                                     -4.657762636107262),
-                                    ("le <day-of-month> (non ordinal)avant <time-of-day>",
-                                     -5.574053367981417),
-                                    ("<dim time> <part-of-day>apr\232s <time-of-day>",
-                                     -5.574053367981417),
-                                    ("named-month<time-of-day> heures", -4.475441079313307),
-                                    ("demainapr\232s <time-of-day>", -5.574053367981417),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-day",
-                                     -5.168588259873252),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -4.657762636107262),
-                                    ("<time-of-day> - <time-of-day> (interval)intersect",
-                                     -5.574053367981417),
-                                    ("apr\232s <time-of-day>\224|vers <time-of-day>",
-                                     -4.657762636107262),
-                                    ("\224|vers <time-of-day>named-day", -4.880906187421472),
-                                    ("le <time>year", -5.168588259873252),
-                                    ("apr\232s <time-of-day>le <day-of-month> (non ordinal)",
-                                     -5.168588259873252),
-                                    ("de <datetime> - <datetime> (interval)<day-of-month> <named-month>",
-                                     -5.574053367981417),
-                                    ("minuteyear", -4.187759006861526),
-                                    ("yearminute", -4.880906187421472),
-                                    ("<dim time> <part-of-day><time-of-day> heures",
-                                     -5.574053367981417)],
-                               n = 155}}),
-       ("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}}),
-       ("ce <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("le <cycle> de <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthmonth", -1.9459101490553135),
-                                    ("mois (grain)named-month", -1.9459101490553135),
-                                    ("weekday", -1.540445040947149),
-                                    ("semaine (grain)<day-of-month> <named-month>",
-                                     -1.540445040947149)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("semaine (grain)year (latent)", -1.6739764335716716),
-                                    ("weekhour", -1.6739764335716716),
-                                    ("semaine (grain)time-of-day (latent)", -1.6739764335716716),
-                                    ("weekyear", -1.6739764335716716)],
-                               n = 4}}),
-       ("<hour-of-day> et trois quarts",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("<time-of-day> heures", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("le <day-of-month> \224 <datetime>",
-        Classifier{okData =
-                     ClassData{prior = -0.325422400434628, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)<time-of-day> heures", -1.9459101490553135),
-                                    ("integer (numeric)<dim time> du soir", -2.8622008809294686),
-                                    ("integer (numeric)intersect", -2.456735772821304),
-                                    ("integer (numeric)<dim time> du matin", -2.8622008809294686),
-                                    ("hour", -0.916290731874155),
-                                    ("integer (numeric)time-of-day (latent)", -2.169053700369523),
-                                    ("integer (numeric)<dim time> <part-of-day>",
-                                     -2.456735772821304)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -1.2809338454620642, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)year (latent)", -1.3350010667323402),
-                                    ("year", -1.3350010667323402), ("hour", -2.2512917986064953),
-                                    ("integer (numeric)time-of-day (latent)", -2.2512917986064953)],
-                               n = 5}}),
-       ("yyyy-mm-dd",
-        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}}),
-       ("le <cycle> dernier",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("ann\233e (grain)", -1.9459101490553135),
-                                    ("semaine (grain)", -1.540445040947149),
-                                    ("mois (grain)", -1.9459101490553135),
-                                    ("year", -1.9459101490553135), ("month", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 19}}),
-       ("soir de no\235l",
-        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}}),
-       ("fin de journ\233e",
-        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}}),
-       ("du <datetime>-<day-of-week> dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersectnamed-daynamed-month", -1.9459101490553135),
-                                    ("day of month (premier)named-daynamed-month",
-                                     -1.9459101490553135),
-                                    ("<day-of-week> <day-of-month>named-daynamed-month",
-                                     -1.9459101490553135),
-                                    ("daydaymonth", -1.252762968495368)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)named-daynamed-month", -1.791759469228055),
-                                    ("hourdaymonth", -1.791759469228055),
-                                    ("time-of-day (latent)named-daynamed-month",
-                                     -1.791759469228055),
-                                    ("yeardaymonth", -1.791759469228055)],
-                               n = 2}}),
-       ("milieu de semaine",
-        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}}),
-       ("d\233but d'ann\233e",
-        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}}),
-       ("noel",
-        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}}),
-       ("fin de matin\233e",
-        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}}),
-       ("le <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -1.9802627296179754e-2)],
-                               n = 49},
-                   koData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.24512245803298496),
-                                    ("numbers 22..29 32..39 .. 52..59", -1.5260563034950494)],
-                               n = 21}}),
-       ("du dd-<day-of-week> dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -0.6931471805599453),
-                                    ("daymonth", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("en semaine",
-        Classifier{okData =
-                     ClassData{prior = -1.2656663733312759,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.3313571359544425,
-                               unseen = -3.4011973816621555,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 28}}),
-       ("numbers 22..29 32..39 .. 52..59",
-        Classifier{okData =
-                     ClassData{prior = -2.3025850929940455,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (20..60)number (0..16)", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.2876820724517809),
-                                    ("integer (numeric)number (0..16)", -1.791759469228055)],
-                               n = 9}}),
-       ("<day-of-week> prochain",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by 'de' or ','",
-        Classifier{okData =
-                     ClassData{prior = -0.26469255422708216,
-                               unseen = -4.430816798843313,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -3.3202283191284883),
-                                    ("daymonth", -3.7256934272366524),
-                                    ("hourmonth", -3.7256934272366524),
-                                    ("dayday", -1.7797832781813394),
-                                    ("named-dayle <cycle> prochain|suivant|d'apr\232s",
-                                     -2.339399066116762),
-                                    ("named-day<time-of-day> - <time-of-day> (interval)",
-                                     -3.3202283191284883),
-                                    ("named-dayle <time>", -1.5284688499004333),
-                                    ("named-dayle <cycle> dernier", -3.7256934272366524),
-                                    ("named-day<named-month|named-day> suivant|d'apr\232s",
-                                     -2.8094026953624978),
-                                    ("week-endnamed-month", -3.7256934272366524),
-                                    ("dayweek", -1.5856272637403819),
-                                    ("fin du moisnamed-month", -3.7256934272366524)],
-                               n = 33},
-                   koData =
-                     ClassData{prior = -1.4586150226995167,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -2.917770732084279),
-                                    ("dayhour", -2.917770732084279),
-                                    ("daymonth", -2.001480000210124),
-                                    ("du|dans le <part-of-day>noel", -2.917770732084279),
-                                    ("en semainenamed-month", -2.512305623976115),
-                                    ("hourmonth", -2.512305623976115),
-                                    ("dayday", -2.512305623976115),
-                                    ("en semaineintersect", -2.512305623976115),
-                                    ("named-dayle <time>", -2.512305623976115),
-                                    ("named-day<time-of-day> heures", -2.917770732084279),
-                                    ("week-endnamed-month", -2.512305623976115)],
-                               n = 10}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.624972813284271,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 100},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("milieu d'apr\232s-midi",
-        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}}),
-       ("ce <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("soir", -1.6094379124341003),
-                                    ("apr\232s-midi", -1.0986122886681098),
-                                    ("hour", -0.7621400520468967)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:|h)mm (time-of-day)",
-        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}}),
-       ("number (20..60)",
-        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}}),
-       ("hier",
-        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}}),
-       ("plus tard",
-        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}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2876820724517809),
-                                    ("numbers 22..29 32..39 .. 52..59", -2.0794415416798357),
-                                    ("number (0..16)", -2.0794415416798357)],
-                               n = 13}}),
-       ("dd-dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("plus tard <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("du|dans le <part-of-day>", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime>-<day-of-week> dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersectnamed-daynamed-month", -2.0794415416798357),
-                                    ("day of month (premier)named-daynamed-month",
-                                     -1.791759469228055),
-                                    ("<day-of-week> <day-of-month>named-daynamed-month",
-                                     -1.791759469228055),
-                                    ("daydaymonth", -0.9808292530117262)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)named-daynamed-month", -1.5686159179138452),
-                                    ("hourdaymonth", -1.5686159179138452),
-                                    ("time-of-day (latent)named-daynamed-month",
-                                     -1.5686159179138452),
-                                    ("yeardaymonth", -1.5686159179138452)],
-                               n = 8}}),
-       ("<dim time> du soir",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>", -1.55814461804655),
-                                    ("hour", -0.7472144018302211),
-                                    ("<time-of-day> heures", -1.1526795099383855)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8472978603872037),
-                                    ("<time-of-day> heures", -0.8472978603872037)],
-                               n = 2}}),
-       ("aujourd'hui",
-        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}}),
-       ("midi",
-        Classifier{okData =
-                     ClassData{prior = -1.157452788691043, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.37729423114146804,
-                               unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24}}),
-       ("toussaint",
-        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}}),
-       ("d\233but de soir\233e",
-        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}}),
-       ("<day-of-week> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.24512245803298496,
-                               unseen = -3.6888794541139363,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynumber (0..16)", -2.5649493574615367),
-                                    ("named-dayinteger (numeric)", -0.8303483020734304),
-                                    ("day", -0.719122666963206)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -1.5260563034950494, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayinteger (numeric)", -0.7731898882334817),
-                                    ("day", -0.7731898882334817)],
-                               n = 5}}),
-       ("d'ici <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.252762968495368), ("day", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\224|vers <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.21936282847430377,
-                               unseen = -5.420534999272286,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -4.722953221644475),
-                                    ("<hour-of-day> et|pass\233 de <number>", -4.31748811353631),
-                                    ("hh(:|h)mm (time-of-day)", -4.722953221644475),
-                                    ("midi", -4.31748811353631),
-                                    ("time-of-day (latent)", -1.587459005715325),
-                                    ("<hour-of-day> et|pass\233 de <number> minutes",
-                                     -4.31748811353631),
-                                    ("minuit", -4.722953221644475),
-                                    ("<hour-of-day> et quart", -4.31748811353631),
-                                    ("hour", -0.8622235106038793),
-                                    ("<hour-of-day> et demi", -4.722953221644475),
-                                    ("minute", -2.8511510447428834),
-                                    ("<time-of-day> heures", -1.587459005715325),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -3.8066624897703196)],
-                               n = 106},
-                   koData =
-                     ClassData{prior = -1.6247053845648889, unseen = -4.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)", -3.0757749812275272),
-                                    ("time-of-day (latent)", -1.5353299402803784),
-                                    ("hour", -1.0388930539664873), ("minute", -2.5649493574615367),
-                                    ("<time-of-day> heures", -1.8718021769015913),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -3.0757749812275272)],
-                               n = 26}}),
-       ("d\233but <named-month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("d\233but de matin\233e",
-        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}}),
-       ("apr\232s-midi",
-        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}}),
-       ("le <ordinal> <cycle> de <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7047480922384253),
-                                    ("ordinals (premier..seizieme)semaine (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)jour (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("weekmonth", -1.2992829841302609),
-                                    ("ordinals (premier..seizieme)semaine (grain)intersect",
-                                     -1.7047480922384253)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (premier..seizieme)",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("deuxi\232me quinzaine de <named-month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<dim time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.183001824763224e-2,
-                               unseen = -5.834810737062605,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> <named-month>d\233but de journ\233e",
-                                     -5.1387352967235715),
-                                    ("dayhour", -1.6123747721074102),
-                                    ("<day-of-month> <named-month>d\233but de matin\233e",
-                                     -5.1387352967235715),
-                                    ("aujourd'huimilieu d'apr\232s-midi", -5.1387352967235715),
-                                    ("named-monthd\233but d'apr\232s-midi", -5.1387352967235715),
-                                    ("aujourd'huifin d'apr\232s-midi", -5.1387352967235715),
-                                    ("named-monthd\233but de matin\233e", -5.1387352967235715),
-                                    ("aujourd'huimilieu de matin\233e", -5.1387352967235715),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -3.6346578999472974),
-                                    ("named-monthd\233but de soir\233e", -5.1387352967235715),
-                                    ("le <time>du|dans le <part-of-day>", -4.222444564849416),
-                                    ("aujourd'huifin de matin\233e", -5.1387352967235715),
-                                    ("aujourd'huifin de soir\233e", -5.1387352967235715),
-                                    ("\224|vers <time-of-day>ce <part-of-day>", -4.445588116163626),
-                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
-                                     -5.1387352967235715),
-                                    ("named-daymatin", -4.733270188615407),
-                                    ("named-monthmilieu de matin\233e", -5.1387352967235715),
-                                    ("demainsoir", -5.1387352967235715),
-                                    ("aujourd'huid\233but de soir\233e", -5.1387352967235715),
-                                    ("named-monthfin de soir\233e", -5.1387352967235715),
-                                    ("<hour-of-day> et demice <part-of-day>", -4.445588116163626),
-                                    ("le <time>fin de matin\233e", -5.1387352967235715),
-                                    ("intersectmilieu de journ\233e", -5.1387352967235715),
-                                    ("intersectfin de journ\233e", -5.1387352967235715),
-                                    ("monthhour", -3.3469758274955166),
-                                    ("le <time>fin d'apr\232s-midi", -5.1387352967235715),
-                                    ("named-monthmilieu d'apr\232s-midi", -5.1387352967235715),
-                                    ("hourhour", -2.1430030231695802),
-                                    ("aujourd'huiau d\233jeuner", -5.1387352967235715),
-                                    ("<hour-of-day> et quartce <part-of-day>", -4.445588116163626),
-                                    ("intersectfin d'apr\232s-midi", -5.1387352967235715),
-                                    ("intersectmilieu d'apr\232s-midi", -5.1387352967235715),
-                                    ("named-monthfin de journ\233e", -5.1387352967235715),
-                                    ("le <time>milieu de journ\233e", -5.1387352967235715),
-                                    ("aujourd'huid\233but de journ\233e", -5.1387352967235715),
-                                    ("demainapr\232s-midi", -5.1387352967235715),
-                                    ("minutehour", -3.26693311982198),
-                                    ("named-daydu|dans le <part-of-day>", -4.733270188615407),
-                                    ("aujourd'huimilieu de journ\233e", -5.1387352967235715),
-                                    ("intersectd\233but de soir\233e", -5.1387352967235715),
-                                    ("aujourd'huifin de journ\233e", -5.1387352967235715),
-                                    ("intersectdu|dans le <part-of-day>", -2.787360039560094),
-                                    ("le <day-of-month> \224 <datetime>du|dans le <part-of-day>",
-                                     -4.733270188615407),
-                                    ("named-monthd\233but de journ\233e", -5.1387352967235715),
-                                    ("intersectd\233but d'apr\232s-midi", -5.1387352967235715),
-                                    ("named-dayfin d'apr\232s-midi", -4.733270188615407),
-                                    ("le <time>d\233but d'apr\232s-midi", -5.1387352967235715),
-                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
-                                     -4.733270188615407),
-                                    ("<day-of-month> <named-month>d\233but de soir\233e",
-                                     -5.1387352967235715),
-                                    ("hierdu|dans le <part-of-day>", -5.1387352967235715),
-                                    ("le <time>d\233but de soir\233e", -5.1387352967235715),
-                                    ("intersectd\233but de journ\233e", -5.1387352967235715),
-                                    ("le <time>d\233but de matin\233e", -5.1387352967235715),
-                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
-                                     -5.1387352967235715),
-                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
-                                     -5.1387352967235715),
-                                    ("named-daysoir", -5.1387352967235715),
-                                    ("named-monthfin de matin\233e", -5.1387352967235715),
-                                    ("le <time>milieu de matin\233e", -5.1387352967235715),
-                                    ("aujourd'huid\233but de matin\233e", -4.0401230080554615),
-                                    ("le <time>fin de soir\233e", -5.1387352967235715),
-                                    ("<day-of-month> <named-month>milieu de matin\233e",
-                                     -5.1387352967235715),
-                                    ("<day-of-month> <named-month>fin de soir\233e",
-                                     -5.1387352967235715),
-                                    ("<day-of-month> <named-month>fin de matin\233e",
-                                     -5.1387352967235715),
-                                    ("<time-of-day> heuresce <part-of-day>", -4.445588116163626),
-                                    ("named-monthfin d'apr\232s-midi", -5.1387352967235715),
-                                    ("aujourd'huid\233but d'apr\232s-midi", -5.1387352967235715),
-                                    ("le <time>milieu d'apr\232s-midi", -5.1387352967235715),
-                                    ("\224|vers <time-of-day>du|dans le <part-of-day>",
-                                     -4.0401230080554615),
-                                    ("<day-of-month> <named-month>fin de journ\233e",
-                                     -5.1387352967235715),
-                                    ("<day-of-month> <named-month>milieu de journ\233e",
-                                     -5.1387352967235715),
-                                    ("le <time>fin de journ\233e", -5.1387352967235715),
-                                    ("intersectfin de matin\233e", -5.1387352967235715),
-                                    ("named-monthmilieu de journ\233e", -5.1387352967235715),
-                                    ("named-dayapr\232s-midi", -5.1387352967235715),
-                                    ("intersectfin de soir\233e", -5.1387352967235715),
-                                    ("intersectmilieu de matin\233e", -5.1387352967235715),
-                                    ("intersectapr\232s-midi", -4.222444564849416),
-                                    ("le <time>d\233but de journ\233e", -5.1387352967235715),
-                                    ("intersectd\233but de matin\233e", -5.1387352967235715),
-                                    ("hiersoir", -5.1387352967235715)],
-                               n = 129},
-                   koData =
-                     ClassData{prior = -2.5437471498109336, unseen = -4.663439094112067,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -3.5553480614894135),
-                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
-                                     -3.2676659890376327),
-                                    ("le <time>du|dans le <part-of-day>", -3.5553480614894135),
-                                    ("aujourd'huidu|dans le <part-of-day>", -3.5553480614894135),
-                                    ("monthhour", -3.5553480614894135),
-                                    ("hourhour", -2.5745188084776873),
-                                    ("<time-of-day> - <time-of-day> (interval)du|dans le <part-of-day>",
-                                     -3.5553480614894135),
-                                    ("named-monthdu|dans le <part-of-day>", -3.5553480614894135)],
-                               n = 11}}),
-       ("jour de l'an",
-        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}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -4.574710978503383,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.15762894420358317),
-                                    ("number (0..16)", -2.0794415416798357)],
-                               n = 92},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.24740817331384096),
-                                    ("numbers 22..29 32..39 .. 52..59", -2.681021528714291),
-                                    ("number (20..60)", -3.597312260588446),
-                                    ("number (0..16)", -2.093234863812172)],
-                               n = 69}}),
-       ("apr\232s-demain",
-        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}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.46262352194811296,
-                               unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 17},
-                   koData =
-                     ClassData{prior = -0.9932517730102834,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 10}}),
-       ("<hour-of-day> et|pass\233 de <number> minutes",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>number (20..60)", -2.3025850929940455),
-                                    ("<time-of-day> heuresinteger (numeric)", -2.3025850929940455),
-                                    ("\224|vers <time-of-day>number (0..16)", -2.3025850929940455),
-                                    ("hour", -0.916290731874155),
-                                    ("<time-of-day> heuresnumber (20..60)", -1.8971199848858813),
-                                    ("<time-of-day> heuresnumber (0..16)", -1.8971199848858813)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -4.204692619390966,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.580216829592325),
-                                    ("number (0..16)semaine (grain)", -3.0910424533583156),
-                                    ("number (0..16)ann\233e (grain)", -3.0910424533583156),
-                                    ("number (0..16)seconde (grain)", -3.4965075614664802),
-                                    ("number (0..16)jour (grain)", -3.4965075614664802),
-                                    ("second", -3.4965075614664802),
-                                    ("integer (numeric)ann\233e (grain)", -3.4965075614664802),
-                                    ("number (0..16)minute (grain)", -3.0910424533583156),
-                                    ("integer (numeric)jour (grain)", -3.0910424533583156),
-                                    ("day", -2.803360380906535), ("year", -2.803360380906535),
-                                    ("number (0..16)mois (grain)", -3.0910424533583156),
-                                    ("hour", -2.580216829592325),
-                                    ("number (0..16)heure (grain)", -3.0910424533583156),
-                                    ("month", -3.0910424533583156),
-                                    ("integer (numeric)minute (grain)", -2.803360380906535),
-                                    ("minute", -2.3978952727983707),
-                                    ("integer (numeric)semaine (grain)", -3.0910424533583156),
-                                    ("numbers 22..29 32..39 .. 52..59heure (grain)",
-                                     -3.4965075614664802),
-                                    ("integer (numeric)heure (grain)", -3.4965075614664802)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -0.5108256237659907, unseen = -4.48863636973214,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.784189633918261),
-                                    ("number (20..60)minute (grain)", -3.784189633918261),
-                                    ("number (0..16)jour (grain)", -3.0910424533583156),
-                                    ("integer (numeric)ann\233e (grain)", -3.784189633918261),
-                                    ("number (0..16)minute (grain)", -3.784189633918261),
-                                    ("day", -3.0910424533583156), ("year", -3.784189633918261),
-                                    ("hour", -1.2584609896100056),
-                                    ("number (0..16)heure (grain)", -1.9123874570166697),
-                                    ("month", -3.784189633918261),
-                                    ("integer (numeric)minute (grain)", -3.784189633918261),
-                                    ("integer (numeric)mois (grain)", -3.784189633918261),
-                                    ("minute", -3.0910424533583156),
-                                    ("integer (numeric)semaine (grain)", -3.784189633918261),
-                                    ("integer (numeric)heure (grain)", -1.9123874570166697)],
-                               n = 33}}),
-       ("avant-hier",
-        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}}),
-       ("d\233but de journ\233e",
-        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}}),
-       ("entre <time-of-day> et <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhour", -2.6741486494265287),
-                                    ("miditime-of-day (latent)", -2.6741486494265287),
-                                    ("minutehour", -0.9694005571881036),
-                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
-                                     -2.268683541318364),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -1.9810014688665833),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -1.9810014688665833),
-                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
-                                     -2.268683541318364)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.8718021769015913,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minutehour", -1.2992829841302609),
-                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
-                                     -1.7047480922384253),
-                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
-                                     -1.7047480922384253)],
-                               n = 2}}),
-       ("d\233but du mois",
-        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}}),
-       ("matin",
-        Classifier{okData =
-                     ClassData{prior = -0.7472144018302211,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -0.6418538861723948,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("en <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("maintenant",
-        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-week> 1er-<day-of-week> dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-daynamed-month", -0.6931471805599453),
-                                    ("daydaymonth", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.553876891600541,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 93},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("au d\233jeuner",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("le lendemain du <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.3862943611198906),
-                                    ("<day-of-month> <named-month>", -1.3862943611198906)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)", -1.6094379124341003),
-                                    ("year", -1.6094379124341003), ("hour", -1.6094379124341003)],
-                               n = 2}}),
-       ("le <cycle> prochain|suivant|d'apr\232s",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.970291913552122,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.0608719606852628),
-                                    ("ann\233e (grain)", -3.258096538021482),
-                                    ("semaine (grain)", -1.0608719606852628),
-                                    ("mois (grain)", -2.8526314299133175),
-                                    ("day", -2.8526314299133175), ("year", -3.258096538021482),
-                                    ("jour (grain)", -2.8526314299133175),
-                                    ("month", -2.8526314299133175)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("apr\232s <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -4.219507705176107,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.7197859696029658),
-                                    ("hh(:|h)mm (time-of-day)", -2.8183982582710754),
-                                    ("midi", -3.5115454388310208), ("day", -2.8183982582710754),
-                                    ("time-of-day (latent)", -2.8183982582710754),
-                                    ("hour", -1.4321038971511848), ("minute", -1.9021075263969205),
-                                    ("<time-of-day> heures", -2.8183982582710754),
-                                    ("le <time>", -3.1060803307228566),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -2.5952547069568657)],
-                               n = 27},
-                   koData =
-                     ClassData{prior = -0.4700036292457356,
-                               unseen = -4.6443908991413725,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("demain", -3.248434627109745),
-                                    ("intersect", -2.4375044108934163),
-                                    ("le <day-of-month> (non ordinal)", -3.9415818076696905),
-                                    ("midi", -1.415853163361435), ("day", -3.0252910757955354),
-                                    ("time-of-day (latent)", -3.0252910757955354),
-                                    ("au d\233jeuner", -3.9415818076696905),
-                                    ("hour", -0.8970593699462674),
-                                    ("<time-of-day> heures", -3.0252910757955354)],
-                               n = 45}}),
-       ("dd/-mm",
-        Classifier{okData =
-                     ClassData{prior = -0.7375989431307791,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.6505875661411494, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("minuit",
-        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}}),
-       ("entre dd et dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("une <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -2.174751721484161, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4849066497880004),
-                                    ("ann\233e (grain)", -2.4849066497880004),
-                                    ("seconde (grain)", -2.4849066497880004),
-                                    ("semaine (grain)", -2.4849066497880004),
-                                    ("second", -2.4849066497880004),
-                                    ("minute (grain)", -2.4849066497880004),
-                                    ("year", -2.4849066497880004),
-                                    ("heure (grain)", -2.4849066497880004),
-                                    ("hour", -2.4849066497880004), ("minute", -2.4849066497880004)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.12062798778861475,
-                               unseen = -4.532599493153256,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2636920390275583),
-                                    ("semaine (grain)", -1.2636920390275583),
-                                    ("mois (grain)", -2.91235066461494), ("day", -2.12389330425067),
-                                    ("jour (grain)", -2.12389330425067),
-                                    ("month", -2.91235066461494)],
-                               n = 39}}),
-       ("<hour-of-day> et quart",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midi", -2.1972245773362196),
-                                    ("\224|vers <time-of-day>", -1.791759469228055),
-                                    ("hour", -0.8109302162163288),
-                                    ("<time-of-day> heures", -1.2809338454620642)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number (0..16)",
-        Classifier{okData =
-                     ClassData{prior = -0.2682639865946794, unseen = -3.713572066704308,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 39},
-                   koData =
-                     ClassData{prior = -1.4469189829363254, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("heure (grain)",
-        Classifier{okData =
-                     ClassData{prior = -1.540445040947149, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.2411620568168881,
-                               unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22}}),
-       ("<named-month|named-day> dernier|pass\233",
-        Classifier{okData =
-                     ClassData{prior = -2.3978952727983707,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.791759469228055), ("named-day", -1.791759469228055)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -2.70805020110221),
-                                    ("en semaine", -2.3025850929940455),
-                                    ("day", -1.791759469228055),
-                                    ("\224|vers <time-of-day>", -2.70805020110221),
-                                    ("time-of-day (latent)", -2.70805020110221),
-                                    ("year", -2.70805020110221), ("hour", -1.6094379124341003),
-                                    ("<time-of-day> heures", -2.0149030205422647),
-                                    ("le <time>", -2.3025850929940455)],
-                               n = 10}}),
-       ("milieu de journ\233e",
-        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}}),
-       ("dd/-mm/-yyyy",
-        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}}),
-       ("fin de semaine",
-        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 mm yyyy",
-        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}}),
-       ("fin du mois",
-        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 of month (premier)",
-        Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               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}}),
-       ("jour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.2744368457017603, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
-                   koData =
-                     ClassData{prior = -1.4271163556401458,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("dd mm",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("dernier <cycle> de <time> (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.4816045409242156),
-                                    ("semaine (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.4816045409242156),
-                                    ("semaine (grain)named-month", -1.9924301646902063),
-                                    ("jour (grain)intersect", -1.9924301646902063),
-                                    ("jour (grain)named-month", -1.9924301646902063)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("milieu de matin\233e",
-        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}}),
-       ("avant le d\233jeuner",
-        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}}),
-       ("1er mai",
-        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}}),
-       ("fin de soir\233e",
-        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}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0185695809945732, unseen = -4.454347296253507,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("demain<time-of-day> heures", -3.7495040759303713),
-                                    ("day of month (premier)<day-of-week> <day-of-month>",
-                                     -3.056356895370426),
-                                    ("dayhour", -3.3440389678222067),
-                                    ("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
-                                     -3.3440389678222067),
-                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
-                                     -3.7495040759303713),
-                                    ("minuteminute", -2.044755983691946),
-                                    ("<day-of-month> <named-month><day-of-month> <named-month>",
-                                     -3.3440389678222067),
-                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
-                                     -3.056356895370426),
-                                    ("dayday", -1.8777018990287797),
-                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
-                                     -3.7495040759303713),
-                                    ("<day-of-month> <named-month>day of month (premier)",
-                                     -3.3440389678222067),
-                                    ("minutehour", -3.3440389678222067),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -3.7495040759303713),
-                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
-                                     -3.056356895370426),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -3.7495040759303713),
-                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
-                                     -3.3440389678222067),
-                                    ("<day-of-month> <named-month>intersect", -3.3440389678222067),
-                                    ("intersect<day-of-week> <day-of-month>", -3.3440389678222067)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -0.4480247225269604, unseen = -4.836281906951478,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
-                                     -3.7297014486341915),
-                                    ("monthday", -2.8824035882469876),
-                                    ("intersectnamed-day", -3.7297014486341915),
-                                    ("day of month (premier)named-day", -3.4420193761824103),
-                                    ("named-month<day-of-month> <named-month>",
-                                     -3.7297014486341915),
-                                    ("minuteminute", -3.7297014486341915),
-                                    ("dayday", -1.4961092271270973),
-                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
-                                     -3.7297014486341915),
-                                    ("day of month (premier)<day-of-month> <named-month>",
-                                     -4.135166556742356),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -3.4420193761824103),
-                                    ("minutehour", -2.631089159966082),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -3.4420193761824103),
-                                    ("day of month (premier)intersect", -2.8824035882469876),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -3.4420193761824103),
-                                    ("intersectintersect", -3.2188758248682006),
-                                    ("hh(:|h)mm (time-of-day)intersect", -3.7297014486341915),
-                                    ("named-monthintersect", -3.7297014486341915),
-                                    ("<day-of-week> <day-of-month>named-day", -3.4420193761824103),
-                                    ("named-monthday of month (premier)", -3.7297014486341915),
-                                    ("<day-of-week> <day-of-month>intersect", -2.8824035882469876),
-                                    ("yearminute", -3.4420193761824103)],
-                               n = 46}}),
-       ("<day-of-month> <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.24256163717131135,
-                               unseen = -4.653960350157523,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 51},
-                   koData =
-                     ClassData{prior = -1.5353299402803784,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 14}}),
-       ("<cycle> prochain|suivant|d'apr\232s",
-        Classifier{okData =
-                     ClassData{prior = -8.338160893905101e-2,
-                               unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.0986122886681098),
-                                    ("ann\233e (grain)", -3.295836866004329),
-                                    ("semaine (grain)", -1.0986122886681098),
-                                    ("mois (grain)", -2.890371757896165),
-                                    ("day", -2.6026896854443837), ("year", -3.295836866004329),
-                                    ("jour (grain)", -2.6026896854443837),
-                                    ("month", -2.890371757896165)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -2.5257286443082556,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mois (grain)", -1.791759469228055),
-                                    ("day", -1.791759469228055),
-                                    ("jour (grain)", -1.791759469228055),
-                                    ("month", -1.791759469228055)],
-                               n = 2}}),
-       ("fin <named-month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.2321436812926323, unseen = -4.0943445622221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
-                                     -2.691243082785829),
-                                    ("minuteminute", -1.3694872428035094),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -3.3843902633457743),
-                                    ("<time-of-day> heures<time-of-day> heures",
-                                     -3.3843902633457743),
-                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
-                                     -2.468099531471619),
-                                    ("hourhour", -2.691243082785829),
-                                    ("minutehour", -2.468099531471619),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -2.691243082785829),
-                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
-                                     -2.468099531471619),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -3.3843902633457743),
-                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
-                                     -2.691243082785829),
-                                    ("<time-of-day> heurestime-of-day (latent)",
-                                     -3.3843902633457743)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -0.3448404862917295, unseen = -4.787491742782046,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)time-of-day (latent)",
-                                     -1.7833912195575383),
-                                    ("hourhour", -1.3451362886263831),
-                                    ("time-of-day (latent)<hour-of-day> <integer> (as relative minutes)",
-                                     -4.085976312551584),
-                                    ("hourminute", -4.085976312551584),
-                                    ("minutehour", -1.7346010553881064),
-                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
-                                     -2.987364023883474),
-                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
-                                     -3.169685580677429),
-                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
-                                     -3.169685580677429),
-                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
-                                     -2.6996819514316934),
-                                    ("time-of-day (latent)<time-of-day> heures",
-                                     -2.2942168433235293)],
-                               n = 51}}),
-       ("<named-day> en huit",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> et demi",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midi", -1.791759469228055),
-                                    ("\224|vers <time-of-day>", -1.791759469228055),
-                                    ("hour", -0.8754687373538999),
-                                    ("<time-of-day> heures", -1.3862943611198906)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dernier week-end de <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("du dd au dd(interval)",
-        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}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("avant <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.4469189829363254,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.791759469228055),
-                                    ("hour", -1.2809338454620642),
-                                    ("<time-of-day> heures", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.2682639865946794,
-                               unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.890371757896165),
-                                    ("hh(:|h)mm (time-of-day)", -2.890371757896165),
-                                    ("hier", -2.890371757896165), ("day", -2.890371757896165),
-                                    ("time-of-day (latent)", -1.9740810260220096),
-                                    ("au d\233jeuner", -2.890371757896165),
-                                    ("hour", -1.1856236656577395), ("minute", -2.4849066497880004),
-                                    ("<time-of-day> heures", -1.9740810260220096),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -2.890371757896165)],
-                               n = 13}}),
-       ("fin d'apr\232s-midi",
-        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}}),
-       ("<part-of-day> du <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("matin<day-of-month> <named-month>", -1.0986122886681098),
-                                    ("hourday", -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("matinyear (latent)", -1.0986122886681098),
-                                    ("houryear", -1.0986122886681098)],
-                               n = 1}}),
-       ("<time-of-day> heures",
-        Classifier{okData =
-                     ClassData{prior = -0.1653924946935067, unseen = -5.655991810819852,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>", -1.8238477837795555),
-                                    ("time-of-day (latent)", -1.1526795099383855),
-                                    ("apr\232s <time-of-day>", -4.26619481914876),
-                                    ("hour", -0.7108467576593462),
-                                    ("avant <time-of-day>", -4.553876891600541)],
-                               n = 139},
-                   koData =
-                     ClassData{prior = -1.8809906029559977, unseen = -4.060443010546419,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>", -1.7404661748405046),
-                                    ("time-of-day (latent)", -1.9636097261547143),
-                                    ("apr\232s <time-of-day>", -2.4336133554004498),
-                                    ("hour", -0.8241754429663495),
-                                    ("avant <time-of-day>", -2.4336133554004498),
-                                    ("minute", -3.349904087274605),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -3.349904087274605)],
-                               n = 25}}),
-       ("week-end",
-        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}}),
-       ("le <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.2500510042341341, unseen = -5.942799375126701,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6820747146989494),
-                                    ("<named-month|named-day> suivant|d'apr\232s",
-                                     -3.742946675384212),
-                                    ("<ordinal> <cycle> de <time>", -4.553876891600541),
-                                    ("premi\232re quinzaine de <named-month>(interval)",
-                                     -5.247024072160486),
-                                    ("intersect", -1.988927534139004),
-                                    ("soir de no\235l", -5.247024072160486),
-                                    ("en semaine", -3.542275979922061),
-                                    ("toussaint", -4.841558964052322), ("day", -1.3968764704504275),
-                                    ("deuxi\232me quinzaine de <named-month>(interval)",
-                                     -5.247024072160486),
-                                    ("<dim time> <part-of-day>", -3.1675825304806504),
-                                    ("dd/-mm", -3.994261103665118),
-                                    ("dd/-mm/-yyyy", -4.553876891600541),
-                                    ("dd mm yyyy", -3.994261103665118),
-                                    ("day of month (premier)", -3.994261103665118),
-                                    ("dd mm", -3.994261103665118), ("hour", -1.9148195619852824),
-                                    ("month", -4.553876891600541),
-                                    ("dernier <cycle> de <time> (latent)", -4.330733340286331),
-                                    ("<day-of-month> <named-month>", -2.6820747146989494),
-                                    ("<cycle> prochain|suivant|d'apr\232s", -2.8956488149970085),
-                                    ("dernier week-end de <time>", -5.247024072160486),
-                                    ("<ordinal> week-end de <time>", -4.841558964052322),
-                                    ("<cycle> dernier", -4.148411783492376)],
-                               n = 176},
-                   koData =
-                     ClassData{prior = -1.5085119938441398, unseen = -4.859812404361672,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month|named-day> suivant|d'apr\232s",
-                                     -4.1588830833596715),
-                                    ("intersect", -3.242592351485517),
-                                    ("en semaine", -2.0794415416798357),
-                                    ("day", -1.556193397915288),
-                                    ("<dim time> <part-of-day>", -3.7534179752515073),
-                                    ("dd/-mm", -3.4657359027997265),
-                                    ("<named-month|named-day> dernier|pass\233",
-                                     -3.7534179752515073),
-                                    ("day of month (premier)", -4.1588830833596715),
-                                    ("dd mm", -3.4657359027997265), ("hour", -2.1439800628174073),
-                                    ("<day-of-month> <named-month>", -4.1588830833596715),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.4541349911212467),
-                                    ("minute", -2.4541349911212467),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -2.6548056865833978)],
-                               n = 50}}),
-       ("apr\232s le <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("n <cycle> passes|precedents",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003),
-                                    ("integer (numeric)ann\233e (grain)", -1.6094379124341003),
-                                    ("year", -1.6094379124341003),
-                                    ("integer (numeric)semaine (grain)", -1.6094379124341003)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -1.3862943611198906),
-                                    ("number (0..16)heure (grain)", -1.3862943611198906)],
-                               n = 1}}),
-       ("il y a <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.8718021769015913), ("year", -1.8718021769015913),
-                                    ("<integer> <unit-of-duration>", -0.9555114450274363),
-                                    ("hour", -1.8718021769015913), ("month", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> week-end de <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (premier..seizieme)named-month",
-                                     -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<dim time> du matin",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224|vers <time-of-day>", -1.7346010553881064),
-                                    ("hour", -0.7537718023763802),
-                                    ("<time-of-day> heures", -1.041453874828161)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("<time-of-day> heures", -0.916290731874155)],
-                               n = 1}}),
-       ("d\233but d'apr\232s-midi",
-        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}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -0.8266785731844679, unseen = -4.454347296253507,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuitnumber (0..16)", -3.3440389678222067),
-                                    ("midinumber (20..60)", -3.7495040759303713),
-                                    ("\224|vers <time-of-day>number (20..60)", -3.7495040759303713),
-                                    ("<time-of-day> heuresinteger (numeric)", -1.264597426142371),
-                                    ("\224|vers <time-of-day>number (0..16)", -3.3440389678222067),
-                                    ("midinumber (0..16)", -3.7495040759303713),
-                                    ("hour", -0.8591323180342064),
-                                    ("<time-of-day> heuresnumber (20..60)", -3.3440389678222067),
-                                    ("\224|vers <time-of-day>integer (numeric)",
-                                     -3.7495040759303713),
-                                    ("<time-of-day> heuresnumber (0..16)", -3.3440389678222067)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -0.5753641449035618, unseen = -4.663439094112067,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)numbers 22..29 32..39 .. 52..59",
-                                     -3.960813169597578),
-                                    ("time-of-day (latent)number (0..16)", -3.5553480614894135),
-                                    ("<time-of-day> heuresinteger (numeric)", -2.5745188084776873),
-                                    ("avant <time-of-day>integer (numeric)", -3.960813169597578),
-                                    ("time-of-day (latent)integer (numeric)", -1.3217558399823195),
-                                    ("apr\232s <time-of-day>integer (numeric)", -3.044522437723423),
-                                    ("hour", -0.8253189536684283),
-                                    ("\224|vers <time-of-day>integer (numeric)",
-                                     -3.5553480614894135),
-                                    ("<time-of-day> heuresnumber (0..16)", -3.960813169597578)],
-                               n = 45}}),
-       ("<cycle> dernier",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.9924301646902063),
-                                    ("ann\233e (grain)", -2.3978952727983707),
-                                    ("semaine (grain)", -1.9924301646902063),
-                                    ("mois (grain)", -2.3978952727983707),
-                                    ("day", -1.9924301646902063), ("year", -2.3978952727983707),
-                                    ("jour (grain)", -1.9924301646902063),
-                                    ("month", -2.3978952727983707)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("heure (grain)", -1.791759469228055),
-                                    ("hour", -1.791759469228055)],
-                               n = 1}}),
-       ("ce|dans le <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2992829841302609),
-                                    ("ann\233e (grain)", -2.3978952727983707),
-                                    ("semaine (grain)", -1.2992829841302609),
-                                    ("day", -1.9924301646902063), ("year", -2.3978952727983707),
-                                    ("jour (grain)", -1.9924301646902063)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ce <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("soir", -1.466337068793427), ("day", -1.8718021769015913),
-                                    ("named-day", -1.8718021769015913),
-                                    ("hour", -1.1786549963416462),
-                                    ("week-end", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/FR_XX.hs b/Duckling/Ranking/Classifiers/FR_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/FR_XX.hs
@@ -0,0 +1,2701 @@
+-- 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.FR_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("n derniers <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.803360380906535),
+                                    ("number (0..16)seconde (grain)", -2.803360380906535),
+                                    ("number (0..16)jour (grain)", -2.803360380906535),
+                                    ("second", -2.3978952727983707),
+                                    ("integer (numeric)ann\233e (grain)", -2.803360380906535),
+                                    ("integer (numeric)seconde (grain)", -2.803360380906535),
+                                    ("number (0..16)minute (grain)", -2.803360380906535),
+                                    ("integer (numeric)jour (grain)", -2.803360380906535),
+                                    ("day", -2.3978952727983707), ("year", -2.803360380906535),
+                                    ("month", -2.803360380906535),
+                                    ("integer (numeric)minute (grain)", -2.803360380906535),
+                                    ("integer (numeric)mois (grain)", -2.803360380906535),
+                                    ("minute", -2.3978952727983707),
+                                    ("integer (numeric)semaine (grain)", -2.803360380906535)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> prochain",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mardi", -1.0986122886681098), ("day", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mercredi", -1.3862943611198906), ("day", -0.9808292530117262),
+                                    ("Lundi", -1.3862943611198906)],
+                               n = 2}}),
+       ("du|dans le <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.587786664902119, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("soir", -1.3862943611198906),
+                                    ("apr\232s-midi", -2.174751721484161),
+                                    ("matin", -1.8382794848629478), ("hour", -0.7396671961948381)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -0.8109302162163288,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("soir", -2.1972245773362196),
+                                    ("apr\232s-midi", -2.1972245773362196),
+                                    ("matin", -1.1856236656577395), ("hour", -0.750305594399894)],
+                               n = 16}}),
+       ("dans <duration>",
+        Classifier{okData =
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.639057329615259),
+                                    ("<integer> + '\"", -2.9267394020670396),
+                                    ("second", -2.639057329615259), ("day", -2.9267394020670396),
+                                    ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -1.1921383466789333),
+                                    ("une <unit-of-duration>", -2.2335922215070942),
+                                    ("hour", -2.4159137783010487), ("month", -3.332204510175204),
+                                    ("minute", -1.9459101490553135)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -2.5257286443082556, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9459101490553135), ("day", -1.9459101490553135),
+                                    ("une <unit-of-duration>", -1.540445040947149)],
+                               n = 2}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224|vers <time-of-day>", -1.252762968495368),
+                                    ("hour", -0.8472978603872037),
+                                    ("<time-of-day> heures", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> apr\232s",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..16)jour (grain)", -0.6931471805599453),
+                                    ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.4793738175333202, unseen = -5.484796933490655,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 239},
+                   koData =
+                     ClassData{prior = -0.9654047826860945, unseen = -5.003946305945459,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 147}}),
+       ("<named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Decembre", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("apr\232s le travail",
+        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}}),
+       ("n prochains <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.833213344056216),
+                                    ("number (0..16)seconde (grain)", -2.833213344056216),
+                                    ("second", -2.4277482359480516),
+                                    ("integer (numeric)ann\233e (grain)", -2.833213344056216),
+                                    ("integer (numeric)seconde (grain)", -2.833213344056216),
+                                    ("number (0..16)minute (grain)", -2.833213344056216),
+                                    ("integer (numeric)jour (grain)", -2.833213344056216),
+                                    ("day", -2.833213344056216), ("year", -2.833213344056216),
+                                    ("hour", -2.833213344056216), ("month", -2.833213344056216),
+                                    ("integer (numeric)minute (grain)", -2.833213344056216),
+                                    ("integer (numeric)mois (grain)", -2.833213344056216),
+                                    ("minute", -2.4277482359480516),
+                                    ("integer (numeric)semaine (grain)", -2.833213344056216),
+                                    ("integer (numeric)heure (grain)", -2.833213344056216)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fin d'ann\233e",
+        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-week> <day-of-month> \224 <time-of-day>)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.916290731874155),
+                                    ("Samediinteger (numeric)\224|vers <time-of-day>",
+                                     -2.0149030205422647),
+                                    ("Jeudiinteger (numeric)\224|vers <time-of-day>",
+                                     -2.0149030205422647),
+                                    ("Vendredinumber (0..16)\224|vers <time-of-day>",
+                                     -1.6094379124341003),
+                                    ("Vendrediinteger (numeric)\224|vers <time-of-day>",
+                                     -2.0149030205422647)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("apr\232s le d\233jeuner",
+        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}}),
+       ("<named-day> en quinze",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mercredi", -1.6739764335716716),
+                                    ("Mardi", -1.6739764335716716), ("day", -0.8266785731844679),
+                                    ("Lundi", -1.6739764335716716)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Juillet",
+        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}}),
+       ("entre <datetime> et <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -4.127134385045092,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("le <time>le <day-of-month> (non ordinal)",
+                                     -3.417726683613366),
+                                    ("le <time>le <time>", -3.012261575505202),
+                                    ("dayday", -1.7129785913749407),
+                                    ("hourhour", -3.417726683613366),
+                                    ("le <time>intersect", -3.417726683613366),
+                                    ("miditime-of-day (latent)", -3.417726683613366),
+                                    ("intersectle <day-of-month> (non ordinal)",
+                                     -3.417726683613366),
+                                    ("minutehour", -1.7129785913749407),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -3.012261575505202),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -2.7245795030534206),
+                                    ("le <day-of-month> (non ordinal)le <day-of-month> (non ordinal)",
+                                     -3.012261575505202),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -2.7245795030534206),
+                                    ("intersectintersect", -3.417726683613366),
+                                    ("intersectle <time>", -3.012261575505202),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -3.012261575505202)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.5040773967762742,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
+                                     -2.740840023925201),
+                                    ("dayday", -2.3353749158170367),
+                                    ("le <day-of-month> (non ordinal)intersect",
+                                     -2.740840023925201),
+                                    ("minutehour", -1.824549292051046),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -2.740840023925201),
+                                    ("le <day-of-month> (non ordinal)le <time>",
+                                     -2.740840023925201),
+                                    ("hh(:|h)mm (time-of-day)intersect", -2.740840023925201),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -2.740840023925201)],
+                               n = 6}}),
+       ("soir",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("ann\233e (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}}),
+       ("d\233but de semaine",
+        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}}),
+       ("<hour-of-day> moins <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midinumber (0..16)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month|named-day> suivant|d'apr\232s",
+        Classifier{okData =
+                     ClassData{prior = -0.10178269430994236,
+                               unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.5649493574615367),
+                                    ("en semaine", -1.9771626925594177),
+                                    ("Mercredi", -3.0757749812275272),
+                                    ("Mardi", -3.0757749812275272),
+                                    ("intersect by 'de' or ','", -2.5649493574615367),
+                                    ("day", -0.807091439909163),
+                                    ("le <time>", -1.9771626925594177)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -2.3353749158170367, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("en semaine", -2.0149030205422647),
+                                    ("day", -1.6094379124341003), ("hour", -2.0149030205422647),
+                                    ("<time-of-day> heures", -2.0149030205422647),
+                                    ("le <time>", -2.0149030205422647)],
+                               n = 3}}),
+       ("Samedi",
+        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}}),
+       ("seconde (grain)",
+        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}}),
+       ("<hour-of-day> et|pass\233 de <number>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224|vers <time-of-day>number (20..60)", -2.1400661634962708),
+                                    ("<time-of-day> heuresinteger (numeric)", -2.1400661634962708),
+                                    ("\224|vers <time-of-day>number (0..16)", -2.1400661634962708),
+                                    ("hour", -1.041453874828161),
+                                    ("<time-of-day> heuresnumber (20..60)", -2.1400661634962708),
+                                    ("<time-of-day> heuresnumber (0..16)", -2.1400661634962708)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midiinteger (numeric)", -1.5040773967762742),
+                                    ("hour", -1.5040773967762742)],
+                               n = 1}}),
+       ("<hour-of-day> moins quart",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midi", -0.6931471805599453), ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("de <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.587786664902119, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
+                                     -2.6855773452501515),
+                                    ("minuteminute", -1.5869650565820417),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.0910424533583156),
+                                    ("<time-of-day> heures<time-of-day> heures",
+                                     -3.0910424533583156),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -2.6855773452501515),
+                                    ("hourhour", -2.3978952727983707),
+                                    ("minutehour", -2.174751721484161),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -2.3978952727983707),
+                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
+                                     -2.6855773452501515),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.0910424533583156),
+                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
+                                     -2.6855773452501515),
+                                    ("<time-of-day> heurestime-of-day (latent)",
+                                     -3.0910424533583156)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -0.8109302162163288,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minutehour", -1.072636802264849),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -2.2512917986064953),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -2.538973871058276),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -2.538973871058276),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -1.845826690498331)],
+                               n = 12}}),
+       ("<datetime>-dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.466337068793427, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> <named-month>Juillet", -1.7346010553881064),
+                                    ("daymonth", -1.4469189829363254),
+                                    ("day of month (premier)Juillet", -2.1400661634962708)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.262364264467491, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)Juillet", -2.0476928433652555),
+                                    ("hourmonth", -1.824549292051046),
+                                    ("time-of-day (latent)Juillet", -2.0476928433652555),
+                                    ("monthmonth", -2.3353749158170367),
+                                    ("yearmonth", -1.824549292051046),
+                                    ("year (latent)Septembre", -2.740840023925201),
+                                    ("time-of-day (latent)Septembre", -2.740840023925201),
+                                    ("JuilletJuillet", -2.3353749158170367)],
+                               n = 10}}),
+       ("semaine (grain)",
+        Classifier{okData =
+                     ClassData{prior = -7.79615414697118e-2,
+                               unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -2.5902671654458267,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("demain",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -1.0116009116784799, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("mois (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}}),
+       ("intersect by 'mais/par exemple/plut\244t'",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.9704144655697013),
+                                    ("Jeudientre <datetime> et <datetime> (interval)",
+                                     -1.466337068793427),
+                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
+                                     -2.9704144655697013),
+                                    ("dayminute", -0.8303483020734304),
+                                    ("Jeudientre <time-of-day> et <time-of-day> (interval)",
+                                     -1.466337068793427)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("de <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.410986973710262, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day of month (premier)<day-of-week> <day-of-month>",
+                                     -3.4339872044851463),
+                                    ("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
+                                     -3.4339872044851463),
+                                    ("minuteminute", -2.517696472610991),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -3.4339872044851463),
+                                    ("dayday", -2.517696472610991),
+                                    ("<day-of-month> <named-month>day of month (premier)",
+                                     -3.4339872044851463),
+                                    ("minutehour", -3.028522096376982),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.4339872044851463),
+                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
+                                     -3.4339872044851463),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.4339872044851463),
+                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
+                                     -3.4339872044851463),
+                                    ("<day-of-month> <named-month>intersect", -3.4339872044851463),
+                                    ("intersect<day-of-week> <day-of-month>", -3.4339872044851463)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.27958486221916157,
+                               unseen = -4.653960350157523,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
+                                     -3.951243718581427),
+                                    ("<day-of-month> <named-month>time-of-day (latent)",
+                                     -3.951243718581427),
+                                    ("hourday", -3.0349529867072724),
+                                    ("dayhour", -3.951243718581427),
+                                    ("yearhour", -3.951243718581427),
+                                    ("time-of-day (latent)year (latent)", -3.951243718581427),
+                                    ("houryear", -3.951243718581427),
+                                    ("time-of-day (latent)intersect", -3.545778610473263),
+                                    ("<day-of-week> <day-of-month>Dimanche", -3.951243718581427),
+                                    ("year (latent)intersect", -3.545778610473263),
+                                    ("yearyear", -3.951243718581427),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.951243718581427),
+                                    ("dayday", -2.2464956263430023),
+                                    ("year (latent)year (latent)", -3.951243718581427),
+                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
+                                     -3.951243718581427),
+                                    ("hourhour", -3.951243718581427),
+                                    ("time-of-day (latent)<day-of-week> <day-of-month>",
+                                     -3.951243718581427),
+                                    ("minutehour", -2.4471663218051534),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -3.545778610473263),
+                                    ("year (latent)<day-of-week> <day-of-month>",
+                                     -3.951243718581427),
+                                    ("year (latent)time-of-day (latent)", -3.951243718581427),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.951243718581427),
+                                    ("day of month (premier)intersect", -3.545778610473263),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.951243718581427),
+                                    ("intersectintersect", -3.545778610473263),
+                                    ("hh(:|h)mm (time-of-day)intersect", -3.951243718581427),
+                                    ("yearday", -3.0349529867072724),
+                                    ("day of month (premier)Mercredi", -3.951243718581427),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -3.545778610473263),
+                                    ("intersectMercredi", -3.951243718581427),
+                                    ("time-of-day (latent)Dimanche", -3.951243718581427),
+                                    ("<day-of-week> <day-of-month>intersect", -3.545778610473263),
+                                    ("year (latent)Dimanche", -3.951243718581427)],
+                               n = 31}}),
+       ("<ordinal> <cycle> de <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)jour (grain)Octobre", -1.7346010553881064),
+                                    ("ordinals (premier..seizieme)semaine (grain)Octobre",
+                                     -1.7346010553881064),
+                                    ("daymonth", -1.7346010553881064),
+                                    ("weekmonth", -1.2237754316221157),
+                                    ("ordinals (premier..seizieme)semaine (grain)intersect",
+                                     -1.7346010553881064)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("premi\232re quinzaine de <named-month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Avril", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> suivants",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.6094379124341003), ("month", -1.6094379124341003),
+                                    ("integer (numeric)mois (grain)", -1.6094379124341003),
+                                    ("integer (numeric)heure (grain)", -1.6094379124341003)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..16)jour (grain)", -1.2039728043259361),
+                                    ("day", -1.2039728043259361)],
+                               n = 2}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.2260379093405742,
+                               unseen = -6.9726062513017535,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> <named-month><dim time> <part-of-day>",
+                                     -6.278521424165844),
+                                    ("intersect<dim time> du matin", -6.278521424165844),
+                                    ("<hour-of-day> <integer> (as relative minutes)intersect",
+                                     -5.8730563160576805),
+                                    ("<day-of-month> <named-month>d\233but de journ\233e",
+                                     -6.278521424165844),
+                                    ("hourday", -4.027229625559349),
+                                    ("<day-of-month> <named-month>year", -5.585374243605899),
+                                    ("dayhour", -1.915422799377482),
+                                    ("<datetime> - <datetime> (interval)Juillet",
+                                     -5.025758455670476),
+                                    ("daymonth", -2.8607947405524787),
+                                    ("monthyear", -4.7744440273895705),
+                                    ("<day-of-month> <named-month>d\233but de matin\233e",
+                                     -6.278521424165844),
+                                    ("dernier <cycle> de <time> (latent)year", -5.362230692291689),
+                                    ("aujourd'huimilieu d'apr\232s-midi", -6.278521424165844),
+                                    ("<day-of-month> <named-month>\224|vers <time-of-day>",
+                                     -4.7744440273895705),
+                                    ("dd mmyear", -5.025758455670476),
+                                    ("Vendredi\224|vers <time-of-day>", -5.8730563160576805),
+                                    ("Mercredidu|dans le <part-of-day>", -6.278521424165844),
+                                    ("aujourd'huifin d'apr\232s-midi", -6.278521424165844),
+                                    ("day of month (premier)Novembre", -5.585374243605899),
+                                    ("le <day-of-month> (non ordinal)<dim time> du matin",
+                                     -6.278521424165844),
+                                    ("aujourd'huimilieu de matin\233e", -6.278521424165844),
+                                    ("hh(:|h)mm (time-of-day)<day-of-week> <day-of-month>",
+                                     -6.278521424165844),
+                                    ("le <day-of-month> (non ordinal)Fevrier", -4.199079882486009),
+                                    ("Mars<dim time> <part-of-day>", -6.278521424165844),
+                                    ("Lundiday of month (premier)", -5.8730563160576805),
+                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
+                                     -5.585374243605899),
+                                    ("<hour-of-day> et quart<dim time> <part-of-day>",
+                                     -5.8730563160576805),
+                                    ("le <time>du|dans le <part-of-day>", -5.585374243605899),
+                                    ("aujourd'huifin de matin\233e", -6.278521424165844),
+                                    ("Marsyear", -5.8730563160576805),
+                                    ("aujourd'huifin de soir\233e", -6.278521424165844),
+                                    ("\224|vers <time-of-day>ce <part-of-day>", -5.585374243605899),
+                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
+                                     -6.278521424165844),
+                                    ("le <day-of-month> (non ordinal)<dim time> du soir",
+                                     -5.585374243605899),
+                                    ("intersectSeptembre", -5.8730563160576805),
+                                    ("aujourd'huid\233but de soir\233e", -6.278521424165844),
+                                    ("<day-of-week> <day-of-month>Fevrier", -5.8730563160576805),
+                                    ("<hour-of-day> et demice <part-of-day>", -5.8730563160576805),
+                                    ("apr\232s <time-of-day>Jeudi", -5.8730563160576805),
+                                    ("le <time>fin de matin\233e", -6.278521424165844),
+                                    ("Jeudide <time-of-day> - <time-of-day> (interval)",
+                                     -5.8730563160576805),
+                                    ("day of month (premier)Mars", -5.362230692291689),
+                                    ("intersectmilieu de journ\233e", -6.278521424165844),
+                                    ("intersectfin de journ\233e", -6.278521424165844),
+                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
+                                     -6.278521424165844),
+                                    ("Octobreyear", -5.362230692291689),
+                                    ("Fevrierd\233but de matin\233e", -6.278521424165844),
+                                    ("de <datetime> - <datetime> (interval)Juillet",
+                                     -5.8730563160576805),
+                                    ("<hour-of-day> <integer> (as relative minutes)<day-of-week> <day-of-month>",
+                                     -6.278521424165844),
+                                    ("monthhour", -4.081296846829625),
+                                    ("Marsintersect", -6.278521424165844),
+                                    ("Lundile <cycle> prochain|suivant|d'apr\232s",
+                                     -6.278521424165844),
+                                    ("le <time>fin d'apr\232s-midi", -6.278521424165844),
+                                    ("hourmonth", -4.7744440273895705),
+                                    ("<time-of-day> heuresle <time>", -4.7744440273895705),
+                                    ("entre <datetime> et <datetime> (interval)Jeudi",
+                                     -5.8730563160576805),
+                                    ("dayday", -3.9271461670023666),
+                                    ("Septembreyear", -5.8730563160576805),
+                                    ("aujourd'hui<hour-of-day> <integer> (as relative minutes)",
+                                     -5.8730563160576805),
+                                    ("apr\232s <time-of-day>Novembre", -5.585374243605899),
+                                    ("hourhour", -3.752792779857589),
+                                    ("Fevrierd\233but d'apr\232s-midi", -6.278521424165844),
+                                    ("<day-of-week> <day-of-month>\224|vers <time-of-day>",
+                                     -5.179909135497735),
+                                    ("<day-of-week> <day-of-month>Septembre", -6.278521424165844),
+                                    ("le <time>intersect", -5.8730563160576805),
+                                    ("\224|vers <time-of-day><dim time> <part-of-day>",
+                                     -6.278521424165844),
+                                    ("aujourd'huiau d\233jeuner", -6.278521424165844),
+                                    ("Vendrediday of month (premier)", -6.278521424165844),
+                                    ("le <day-of-month> (non ordinal)Avril", -6.278521424165844),
+                                    ("<time-of-day> heuresintersect", -5.362230692291689),
+                                    ("<hour-of-day> et quartce <part-of-day>", -5.8730563160576805),
+                                    ("Jeudi\224|vers <time-of-day>", -6.278521424165844),
+                                    ("dayyear", -3.880626151367474),
+                                    ("le <day-of-month> (non ordinal)Juin", -6.278521424165844),
+                                    ("Lundice|dans le <cycle>", -6.278521424165844),
+                                    ("apr\232s-demain\224|vers <time-of-day>", -5.8730563160576805),
+                                    ("intersectfin d'apr\232s-midi", -6.278521424165844),
+                                    ("le <ordinal> <cycle> de <time>year", -6.278521424165844),
+                                    ("intersectmilieu d'apr\232s-midi", -6.278521424165844),
+                                    ("<hour-of-day> <integer> (as relative minutes)Jeudi",
+                                     -6.278521424165844),
+                                    ("le <time>milieu de journ\233e", -6.278521424165844),
+                                    ("aujourd'huid\233but de journ\233e", -6.278521424165844),
+                                    ("demain\224|vers <time-of-day>", -5.8730563160576805),
+                                    ("le <day-of-month> (non ordinal)Mars", -4.892227063045954),
+                                    ("le <day-of-month> (non ordinal)intersect",
+                                     -3.7936147743778443),
+                                    ("hourminute", -6.278521424165844),
+                                    ("dd-dd <month>(interval)year", -6.278521424165844),
+                                    ("intersect<day-of-month> <named-month>", -5.8730563160576805),
+                                    ("<hour-of-day> <integer> (as relative minutes)Samedi",
+                                     -6.278521424165844),
+                                    ("minutemonth", -5.8730563160576805),
+                                    ("\224|vers <time-of-day>demain", -6.278521424165844),
+                                    ("minutehour", -4.669083511731744),
+                                    ("Lundidu|dans le <part-of-day>", -6.278521424165844),
+                                    ("aujourd'huimilieu de journ\233e", -6.278521424165844),
+                                    ("Mars\224|vers <time-of-day>", -5.585374243605899),
+                                    ("intersectd\233but de soir\233e", -6.278521424165844),
+                                    ("Mardile <cycle> prochain|suivant|d'apr\232s",
+                                     -5.585374243605899),
+                                    ("aujourd'huifin de journ\233e", -6.278521424165844),
+                                    ("le <day-of-month> (non ordinal)Octobre", -6.278521424165844),
+                                    ("intersectdu|dans le <part-of-day>", -4.48676195493779),
+                                    ("le <day-of-month> \224 <datetime>du|dans le <part-of-day>",
+                                     -5.8730563160576805),
+                                    ("hh(:|h)mm (time-of-day)Jeudi", -6.278521424165844),
+                                    ("le <day-of-month> (non ordinal)apr\232s <time-of-day>",
+                                     -6.278521424165844),
+                                    ("le <time>Juillet", -6.278521424165844),
+                                    ("Lundi<day-of-month> <named-month>", -6.278521424165844),
+                                    ("Mercredile <cycle> prochain|suivant|d'apr\232s",
+                                     -5.585374243605899),
+                                    ("Lundifin d'apr\232s-midi", -5.8730563160576805),
+                                    ("Lundile <time>", -5.8730563160576805),
+                                    ("le <day-of-month> (non ordinal)<dim time> <part-of-day>",
+                                     -4.1384552606695735),
+                                    ("Mardi<named-month|named-day> suivant|d'apr\232s",
+                                     -5.8730563160576805),
+                                    ("apr\232s <time-of-day>le <time>", -5.362230692291689),
+                                    ("Mars<dim time> du matin", -6.278521424165844),
+                                    ("le <time>Novembre", -5.585374243605899),
+                                    ("intersectd\233but d'apr\232s-midi", -6.278521424165844),
+                                    ("<datetime> - <datetime> (interval)Jeudi", -5.362230692291689),
+                                    ("Mercredi<named-month|named-day> suivant|d'apr\232s",
+                                     -5.8730563160576805),
+                                    ("<time-of-day> - <time-of-day> (interval)Jeudi",
+                                     -5.025758455670476),
+                                    ("Samedi<day-of-month> <named-month>", -6.278521424165844),
+                                    ("<hour-of-day> et quartdemain", -5.8730563160576805),
+                                    ("<time-of-day> heuresce <time>", -6.278521424165844),
+                                    ("le <time>d\233but d'apr\232s-midi", -6.278521424165844),
+                                    ("day of month (premier)Juillet", -5.585374243605899),
+                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
+                                     -5.8730563160576805),
+                                    ("Fevriermilieu d'apr\232s-midi", -6.278521424165844),
+                                    ("Mercredi\224|vers <time-of-day>", -6.278521424165844),
+                                    ("intersectNovembre", -5.025758455670476),
+                                    ("le <time><dim time> du matin", -6.278521424165844),
+                                    ("Fevrierfin d'apr\232s-midi", -6.278521424165844),
+                                    ("apr\232s <time-of-day>intersect", -5.8730563160576805),
+                                    ("le <day-of-month> (non ordinal)\224|vers <time-of-day>",
+                                     -4.7744440273895705),
+                                    ("<day-of-month> <named-month>d\233but de soir\233e",
+                                     -6.278521424165844),
+                                    ("hierdu|dans le <part-of-day>", -6.278521424165844),
+                                    ("le <time>d\233but de soir\233e", -6.278521424165844),
+                                    ("Mercredice|dans le <cycle>", -6.278521424165844),
+                                    ("Fevrierfin de soir\233e", -6.278521424165844),
+                                    ("intersect<dim time> <part-of-day>", -6.278521424165844),
+                                    ("Mardice|dans le <cycle>", -6.278521424165844),
+                                    ("dayminute", -4.669083511731744),
+                                    ("intersectd\233but de journ\233e", -6.278521424165844),
+                                    ("<ordinal> <cycle> de <time>year", -5.8730563160576805),
+                                    ("Fevriermilieu de matin\233e", -6.278521424165844),
+                                    ("le <time>\224|vers <time-of-day>", -5.179909135497735),
+                                    ("<day-of-month> <named-month><dim time> du matin",
+                                     -6.278521424165844),
+                                    ("intersectyear", -5.585374243605899),
+                                    ("Fevrierfin de matin\233e", -6.278521424165844),
+                                    ("minuteday", -3.334082444999404),
+                                    ("le <time>d\233but de matin\233e", -6.278521424165844),
+                                    ("Mardile <time>", -4.892227063045954),
+                                    ("aujourd'hui\224|vers <time-of-day>", -5.362230692291689),
+                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
+                                     -6.278521424165844),
+                                    ("day of month (premier)intersect", -6.278521424165844),
+                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
+                                     -6.278521424165844),
+                                    ("day of month (premier)Janvier", -6.278521424165844),
+                                    ("de <datetime> - <datetime> (interval)Jeudi",
+                                     -5.8730563160576805),
+                                    ("le <time>milieu de matin\233e", -6.278521424165844),
+                                    ("aujourd'huid\233but de matin\233e", -5.179909135497735),
+                                    ("Fevrierd\233but de soir\233e", -6.278521424165844),
+                                    ("Jeudiapr\232s <time-of-day>", -5.362230692291689),
+                                    ("Mercredile <time>", -4.892227063045954),
+                                    ("<dim time> <part-of-day>apr\232s <time-of-day>",
+                                     -6.278521424165844),
+                                    ("le <time>fin de soir\233e", -6.278521424165844),
+                                    ("de <time-of-day> - <time-of-day> (interval)Jeudi",
+                                     -5.362230692291689),
+                                    ("<day-of-month> <named-month>milieu de matin\233e",
+                                     -6.278521424165844),
+                                    ("<day-of-month> <named-month>fin de soir\233e",
+                                     -6.278521424165844),
+                                    ("<day-of-month> <named-month>fin de matin\233e",
+                                     -6.278521424165844),
+                                    ("<time-of-day> heuresce <part-of-day>", -5.8730563160576805),
+                                    ("Mercredi<day-of-month> <named-month>", -6.278521424165844),
+                                    ("aujourd'huid\233but d'apr\232s-midi", -6.278521424165844),
+                                    ("le <time>milieu d'apr\232s-midi", -6.278521424165844),
+                                    ("\224|vers <time-of-day>du|dans le <part-of-day>",
+                                     -5.179909135497735),
+                                    ("entre <time-of-day> et <time-of-day> (interval)Jeudi",
+                                     -5.8730563160576805),
+                                    ("intersectintersect", -6.278521424165844),
+                                    ("dayweek", -4.081296846829625),
+                                    ("entre <datetime> et <datetime> (interval)Juillet",
+                                     -6.278521424165844),
+                                    ("intersectMars", -6.278521424165844),
+                                    ("weekyear", -4.892227063045954),
+                                    ("le <time>Mars", -5.8730563160576805),
+                                    ("apr\232s le <day-of-month>Mars", -6.278521424165844),
+                                    ("hh(:|h)mm (time-of-day)intersect", -5.8730563160576805),
+                                    ("<day-of-month> <named-month>fin de journ\233e",
+                                     -6.278521424165844),
+                                    ("<day-of-month> <named-month>milieu de journ\233e",
+                                     -6.278521424165844),
+                                    ("le <time>fin de journ\233e", -6.278521424165844),
+                                    ("dd/-mm\224|vers <time-of-day>", -5.8730563160576805),
+                                    ("intersectfin de matin\233e", -6.278521424165844),
+                                    ("Fevrierd\233but de journ\233e", -6.278521424165844),
+                                    ("Vendrediintersect", -6.278521424165844),
+                                    ("<day-of-month> <named-month>intersect", -6.278521424165844),
+                                    ("intersectfin de soir\233e", -6.278521424165844),
+                                    ("intersectmilieu de matin\233e", -6.278521424165844),
+                                    ("intersect\224|vers <time-of-day>", -5.585374243605899),
+                                    ("le <time>year", -4.7744440273895705),
+                                    ("Vendrediapr\232s <time-of-day>", -6.278521424165844),
+                                    ("hh(:|h)mm (time-of-day)Samedi", -6.278521424165844),
+                                    ("le <time><dim time> <part-of-day>", -6.278521424165844),
+                                    ("Fevrierfin de journ\233e", -6.278521424165844),
+                                    ("Fevriermilieu de journ\233e", -6.278521424165844),
+                                    ("le <time>d\233but de journ\233e", -6.278521424165844),
+                                    ("intersectd\233but de matin\233e", -6.278521424165844)],
+                               n = 414},
+                   koData =
+                     ClassData{prior = -1.5979435330083651,
+                               unseen = -6.1070228877422545,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year<time-of-day> - <time-of-day> (interval)",
+                                     -4.718498871295094),
+                                    ("demain<time-of-day> heures", -5.4116460518550396),
+                                    ("hourday", -3.2144214745188204),
+                                    ("<day-of-month> <named-month>year", -5.4116460518550396),
+                                    ("demainavant <time-of-day>", -5.4116460518550396),
+                                    ("dayhour", -2.7374974024285113),
+                                    ("<time-of-day> - <time-of-day> (interval)Juillet",
+                                     -4.718498871295094),
+                                    ("Jeudi<time-of-day> - <time-of-day> (interval)",
+                                     -5.006180943746876),
+                                    ("daymonth", -3.8022081394209395),
+                                    ("monthday", -5.4116460518550396),
+                                    ("monthyear", -4.718498871295094),
+                                    ("yearhour", -4.718498871295094),
+                                    ("le <cycle> de <time>Octobre", -5.006180943746876),
+                                    ("houryear", -5.006180943746876),
+                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
+                                     -4.718498871295094),
+                                    ("le <time>du|dans le <part-of-day>", -5.006180943746876),
+                                    ("Marsyear", -5.4116460518550396),
+                                    ("Dimanche<day-of-month> <named-month>", -4.718498871295094),
+                                    ("<time-of-day> heuresle <day-of-month> (non ordinal)",
+                                     -4.4953553199808844),
+                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
+                                     -5.4116460518550396),
+                                    ("aujourd'huidu|dans le <part-of-day>", -5.006180943746876),
+                                    ("de <datetime> - <datetime> (interval)Juillet",
+                                     -5.4116460518550396),
+                                    ("monthhour", -4.02535169073515),
+                                    ("hourmonth", -4.1588830833596715),
+                                    ("Vendredi<time-of-day> - <time-of-day> (interval)",
+                                     -4.1588830833596715),
+                                    ("dayday", -3.619886582626985),
+                                    ("Septembreyear", -5.4116460518550396),
+                                    ("Lundiapr\232s <time-of-day>", -5.4116460518550396),
+                                    ("hourhour", -3.8022081394209395),
+                                    ("\224|vers <time-of-day>Jeudi", -4.718498871295094),
+                                    ("dayyear", -4.1588830833596715),
+                                    ("le lendemain du <time>Fevrier", -5.4116460518550396),
+                                    ("demain\224|vers <time-of-day>", -5.006180943746876),
+                                    ("Mars\224|vers <time-of-day>", -4.31303376318693),
+                                    ("Lundi<datetime> - <datetime> (interval)", -5.006180943746876),
+                                    ("intersect by 'de' or ','year", -5.006180943746876),
+                                    ("hh(:|h)mm (time-of-day)Jeudi", -5.4116460518550396),
+                                    ("weekmonth", -5.006180943746876),
+                                    ("le <day-of-month> (non ordinal)Juillet", -5.4116460518550396),
+                                    ("le <day-of-month> (non ordinal)year", -5.006180943746876),
+                                    ("Juillet<day-of-month> <named-month>", -5.4116460518550396),
+                                    ("<time-of-day> - <time-of-day> (interval)Septembre",
+                                     -5.4116460518550396),
+                                    ("Samedi<time-of-day> - <time-of-day> (interval)",
+                                     -5.006180943746876),
+                                    ("<time-of-day> heuresdd/-mm", -5.4116460518550396),
+                                    ("<time-of-day> - <time-of-day> (interval)du|dans le <part-of-day>",
+                                     -5.006180943746876),
+                                    ("intersectyear", -5.4116460518550396),
+                                    ("minuteday", -5.4116460518550396),
+                                    ("Mardile <time>", -5.4116460518550396),
+                                    ("Fevrierdu|dans le <part-of-day>", -5.006180943746876),
+                                    ("aujourd'hui\224|vers <time-of-day>", -5.006180943746876),
+                                    ("<datetime>-dd <month>(interval)year", -5.006180943746876),
+                                    ("Jeudiapr\232s <time-of-day>", -5.006180943746876),
+                                    ("Mercredile <time>", -5.4116460518550396),
+                                    ("le <day-of-month> (non ordinal)avant <time-of-day>",
+                                     -5.4116460518550396),
+                                    ("<dim time> <part-of-day>apr\232s <time-of-day>",
+                                     -5.4116460518550396),
+                                    ("Mercredi<day-of-month> <named-month>", -4.4953553199808844),
+                                    ("demainapr\232s <time-of-day>", -5.4116460518550396),
+                                    ("<day-of-week> <day-of-month>Juillet", -4.02535169073515),
+                                    ("<time-of-day> - <time-of-day> (interval)intersect",
+                                     -5.4116460518550396),
+                                    ("apr\232s <time-of-day>\224|vers <time-of-day>",
+                                     -5.006180943746876),
+                                    ("Fevrieryear", -5.4116460518550396),
+                                    ("Jeudi<time-of-day> heures", -5.006180943746876),
+                                    ("apr\232s <time-of-day>le <day-of-month> (non ordinal)",
+                                     -5.006180943746876),
+                                    ("avant <time-of-day>Jeudi", -5.4116460518550396),
+                                    ("de <datetime> - <datetime> (interval)<day-of-month> <named-month>",
+                                     -5.4116460518550396),
+                                    ("<dim time> <part-of-day><time-of-day> heures",
+                                     -5.4116460518550396),
+                                    ("<time-of-day> heuresJeudi", -4.31303376318693)],
+                               n = 105}}),
+       ("Janvier",
+        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}}),
+       ("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}}),
+       ("ce <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453), ("Lundi", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("le <cycle> de <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthmonth", -1.9459101490553135),
+                                    ("mois (grain)Mars", -1.9459101490553135),
+                                    ("weekday", -1.540445040947149),
+                                    ("semaine (grain)<day-of-month> <named-month>",
+                                     -1.540445040947149)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("semaine (grain)year (latent)", -1.6739764335716716),
+                                    ("weekhour", -1.6739764335716716),
+                                    ("semaine (grain)time-of-day (latent)", -1.6739764335716716),
+                                    ("weekyear", -1.6739764335716716)],
+                               n = 4}}),
+       ("<hour-of-day> et trois quarts",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("<time-of-day> heures", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("le <day-of-month> \224 <datetime>",
+        Classifier{okData =
+                     ClassData{prior = -0.325422400434628, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)<time-of-day> heures", -1.9459101490553135),
+                                    ("integer (numeric)<dim time> du soir", -2.8622008809294686),
+                                    ("integer (numeric)intersect", -2.456735772821304),
+                                    ("integer (numeric)<dim time> du matin", -2.8622008809294686),
+                                    ("hour", -0.916290731874155),
+                                    ("integer (numeric)time-of-day (latent)", -2.169053700369523),
+                                    ("integer (numeric)<dim time> <part-of-day>",
+                                     -2.456735772821304)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -1.2809338454620642, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)year (latent)", -1.3350010667323402),
+                                    ("year", -1.3350010667323402), ("hour", -2.2512917986064953),
+                                    ("integer (numeric)time-of-day (latent)", -2.2512917986064953)],
+                               n = 5}}),
+       ("yyyy-mm-dd",
+        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}}),
+       ("Juin",
+        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}}),
+       ("le <cycle> dernier",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149),
+                                    ("ann\233e (grain)", -1.9459101490553135),
+                                    ("semaine (grain)", -1.540445040947149),
+                                    ("mois (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135), ("month", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 19}}),
+       ("soir de no\235l",
+        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}}),
+       ("fin de journ\233e",
+        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}}),
+       ("du <datetime>-<day-of-week> dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day of month (premier)MercrediJuillet", -1.9459101490553135),
+                                    ("intersectMercrediJuillet", -1.9459101490553135),
+                                    ("<day-of-week> <day-of-month>DimancheJuillet",
+                                     -1.9459101490553135),
+                                    ("daydaymonth", -1.252762968495368)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)DimancheJuillet", -1.791759469228055),
+                                    ("hourdaymonth", -1.791759469228055),
+                                    ("yeardaymonth", -1.791759469228055),
+                                    ("year (latent)DimancheJuillet", -1.791759469228055)],
+                               n = 2}}),
+       ("milieu de semaine",
+        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}}),
+       ("d\233but d'ann\233e",
+        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}}),
+       ("noel",
+        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}}),
+       ("fin de matin\233e",
+        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}}),
+       ("le <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -1.9802627296179754e-2)],
+                               n = 49},
+                   koData =
+                     ClassData{prior = -1.2039728043259361,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.24512245803298496),
+                                    ("numbers 22..29 32..39 .. 52..59", -1.5260563034950494)],
+                               n = 21}}),
+       ("du dd-<day-of-week> dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.6931471805599453),
+                                    ("DimancheJuillet", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("en semaine",
+        Classifier{okData =
+                     ClassData{prior = -1.2656663733312759,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.3313571359544425,
+                               unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28}}),
+       ("numbers 22..29 32..39 .. 52..59",
+        Classifier{okData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (20..60)number (0..16)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.2876820724517809),
+                                    ("integer (numeric)number (0..16)", -1.791759469228055)],
+                               n = 9}}),
+       ("Mercredi",
+        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}}),
+       ("Mardi",
+        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}}),
+       ("<day-of-week> prochain",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mercredi", -1.6094379124341003),
+                                    ("Mardi", -1.6094379124341003), ("day", -0.916290731874155),
+                                    ("Lundi", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by 'de' or ','",
+        Classifier{okData =
+                     ClassData{prior = -0.26469255422708216,
+                               unseen = -4.499809670330265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.39002408106403),
+                                    ("Jeudi<time-of-day> - <time-of-day> (interval)",
+                                     -3.39002408106403),
+                                    ("daymonth", -3.7954891891721947),
+                                    ("Dimanchele <time>", -3.7954891891721947),
+                                    ("fin du moisMars", -3.7954891891721947),
+                                    ("Lundile <cycle> prochain|suivant|d'apr\232s",
+                                     -3.7954891891721947),
+                                    ("hourmonth", -3.7954891891721947),
+                                    ("dayday", -1.8495790401168812),
+                                    ("Mardile <cycle> prochain|suivant|d'apr\232s",
+                                     -3.1023420086122493),
+                                    ("Mercredile <cycle> prochain|suivant|d'apr\232s",
+                                     -3.1023420086122493),
+                                    ("Lundile <time>", -3.39002408106403),
+                                    ("Mardi<named-month|named-day> suivant|d'apr\232s",
+                                     -3.39002408106403),
+                                    ("Mercredi<named-month|named-day> suivant|d'apr\232s",
+                                     -3.39002408106403),
+                                    ("Mardile <time>", -2.409194828052304),
+                                    ("Mercredile <time>", -2.409194828052304),
+                                    ("dayweek", -1.6554230256759237),
+                                    ("week-endSeptembre", -3.7954891891721947),
+                                    ("Dimanchele <cycle> dernier", -3.7954891891721947)],
+                               n = 33},
+                   koData =
+                     ClassData{prior = -1.4586150226995167, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("en semaineSeptembre", -2.662587827025453),
+                                    ("hourday", -3.068052935133617),
+                                    ("dayhour", -3.068052935133617),
+                                    ("daymonth", -2.151762203259462),
+                                    ("du|dans le <part-of-day>noel", -3.068052935133617),
+                                    ("hourmonth", -2.662587827025453),
+                                    ("dayday", -2.662587827025453),
+                                    ("en semaineintersect", -2.662587827025453),
+                                    ("Mardile <time>", -3.068052935133617),
+                                    ("Mercredile <time>", -3.068052935133617),
+                                    ("Jeudi<time-of-day> heures", -3.068052935133617),
+                                    ("week-endSeptembre", -2.662587827025453)],
+                               n = 10}}),
+       ("milieu d'apr\232s-midi",
+        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}}),
+       ("ce <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("soir", -1.6094379124341003),
+                                    ("apr\232s-midi", -1.0986122886681098),
+                                    ("hour", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh(:|h)mm (time-of-day)",
+        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}}),
+       ("number (20..60)",
+        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}}),
+       ("hier",
+        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}}),
+       ("plus tard",
+        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}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2876820724517809),
+                                    ("numbers 22..29 32..39 .. 52..59", -2.0794415416798357),
+                                    ("number (0..16)", -2.0794415416798357)],
+                               n = 13}}),
+       ("dd-dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juillet", -1.0116009116784799),
+                                    ("Septembre", -1.7047480922384253),
+                                    ("month", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("plus tard <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("du|dans le <part-of-day>", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime>-<day-of-week> dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day of month (premier)MercrediJuillet", -1.9095425048844386),
+                                    ("<day-of-week> <day-of-month>MercrediJuillet",
+                                     -2.6026896854443837),
+                                    ("intersectMercrediJuillet", -2.1972245773362196),
+                                    ("<day-of-week> <day-of-month>DimancheJuillet",
+                                     -2.1972245773362196),
+                                    ("daydaymonth", -1.0986122886681098)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)DimancheJuillet", -1.9095425048844386),
+                                    ("year (latent)MercrediJuillet", -2.6026896854443837),
+                                    ("hourdaymonth", -1.6863989535702288),
+                                    ("time-of-day (latent)MercrediJuillet", -2.6026896854443837),
+                                    ("yeardaymonth", -1.6863989535702288),
+                                    ("year (latent)DimancheJuillet", -1.9095425048844386)],
+                               n = 8}}),
+       ("<dim time> du soir",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224|vers <time-of-day>", -1.1786549963416462),
+                                    ("hour", -0.7731898882334817),
+                                    ("<time-of-day> heures", -1.466337068793427)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8472978603872037),
+                                    ("<time-of-day> heures", -0.8472978603872037)],
+                               n = 2}}),
+       ("aujourd'hui",
+        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}}),
+       ("midi",
+        Classifier{okData =
+                     ClassData{prior = -1.157452788691043, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.37729423114146804,
+                               unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24}}),
+       ("toussaint",
+        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}}),
+       ("d\233but de soir\233e",
+        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}}),
+       ("<day-of-week> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.24512245803298496,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Vendrediinteger (numeric)", -2.6855773452501515),
+                                    ("Jeudiinteger (numeric)", -2.6855773452501515),
+                                    ("Lundiinteger (numeric)", -2.6855773452501515),
+                                    ("day", -0.8397506547518206),
+                                    ("Mercrediinteger (numeric)", -1.8382794848629478),
+                                    ("Samediinteger (numeric)", -2.174751721484161),
+                                    ("Vendredinumber (0..16)", -2.6855773452501515)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -1.5260563034950494,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Dimancheinteger (numeric)", -1.5040773967762742),
+                                    ("Lundiinteger (numeric)", -1.791759469228055),
+                                    ("day", -1.0986122886681098)],
+                               n = 5}}),
+       ("d'ici <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.252762968495368), ("day", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\224|vers <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.19319122903085847, unseen = -4.90527477843843,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -4.204692619390966),
+                                    ("<hour-of-day> et|pass\233 de <number>", -3.7992275112828016),
+                                    ("hh(:|h)mm (time-of-day)", -4.204692619390966),
+                                    ("midi", -3.7992275112828016),
+                                    ("<hour-of-day> et|pass\233 de <number> minutes",
+                                     -3.7992275112828016),
+                                    ("minuit", -4.204692619390966),
+                                    ("<hour-of-day> et quart", -3.7992275112828016),
+                                    ("hour", -0.9858167945227653),
+                                    ("<hour-of-day> et demi", -4.204692619390966),
+                                    ("minute", -2.332890442489375),
+                                    ("<time-of-day> heures", -1.0691984034618165),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -3.288401887516811)],
+                               n = 61},
+                   koData =
+                     ClassData{prior = -1.739115735742633, unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh(:|h)mm (time-of-day)", -2.538973871058276),
+                                    ("hour", -1.3350010667323402), ("minute", -2.0281482472922856),
+                                    ("<time-of-day> heures", -1.3350010667323402),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -2.538973871058276)],
+                               n = 13}}),
+       ("d\233but <named-month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Avril", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("d\233but de matin\233e",
+        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}}),
+       ("apr\232s-midi",
+        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}}),
+       ("le <ordinal> <cycle> de <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)jour (grain)Octobre", -1.7047480922384253),
+                                    ("ordinals (premier..seizieme)semaine (grain)Octobre",
+                                     -1.7047480922384253),
+                                    ("daymonth", -1.7047480922384253),
+                                    ("weekmonth", -1.2992829841302609),
+                                    ("ordinals (premier..seizieme)semaine (grain)intersect",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (premier..seizieme)",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("deuxi\232me quinzaine de <named-month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Avril", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -5.723585101952381,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mercredisoir", -5.0271645960474665),
+                                    ("<day-of-month> <named-month>d\233but de journ\233e",
+                                     -5.0271645960474665),
+                                    ("dayhour", -1.500804071431305),
+                                    ("<day-of-month> <named-month>d\233but de matin\233e",
+                                     -5.0271645960474665),
+                                    ("aujourd'huimilieu d'apr\232s-midi", -5.0271645960474665),
+                                    ("Mercredidu|dans le <part-of-day>", -5.0271645960474665),
+                                    ("aujourd'huifin d'apr\232s-midi", -5.0271645960474665),
+                                    ("aujourd'huimilieu de matin\233e", -5.0271645960474665),
+                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
+                                     -4.334017415487521),
+                                    ("le <time>du|dans le <part-of-day>", -4.334017415487521),
+                                    ("aujourd'huifin de matin\233e", -5.0271645960474665),
+                                    ("aujourd'huifin de soir\233e", -5.0271645960474665),
+                                    ("\224|vers <time-of-day>ce <part-of-day>", -4.334017415487521),
+                                    ("<day-of-month> <named-month>d\233but d'apr\232s-midi",
+                                     -5.0271645960474665),
+                                    ("demainsoir", -5.0271645960474665),
+                                    ("aujourd'huid\233but de soir\233e", -5.0271645960474665),
+                                    ("Lundimatin", -5.0271645960474665),
+                                    ("<hour-of-day> et demice <part-of-day>", -4.621699487939302),
+                                    ("le <time>fin de matin\233e", -5.0271645960474665),
+                                    ("intersectmilieu de journ\233e", -5.0271645960474665),
+                                    ("intersectfin de journ\233e", -5.0271645960474665),
+                                    ("Fevrierd\233but de matin\233e", -5.0271645960474665),
+                                    ("monthhour", -3.235405126819411),
+                                    ("le <time>fin d'apr\232s-midi", -5.0271645960474665),
+                                    ("hourhour", -2.542257946259466),
+                                    ("Fevrierd\233but d'apr\232s-midi", -5.0271645960474665),
+                                    ("aujourd'huiau d\233jeuner", -5.0271645960474665),
+                                    ("<hour-of-day> et quartce <part-of-day>", -4.621699487939302),
+                                    ("intersectfin d'apr\232s-midi", -5.0271645960474665),
+                                    ("intersectmilieu d'apr\232s-midi", -5.0271645960474665),
+                                    ("le <time>milieu de journ\233e", -5.0271645960474665),
+                                    ("aujourd'huid\233but de journ\233e", -5.0271645960474665),
+                                    ("demainapr\232s-midi", -5.0271645960474665),
+                                    ("minutehour", -3.417726683613366),
+                                    ("Lundidu|dans le <part-of-day>", -5.0271645960474665),
+                                    ("aujourd'huimilieu de journ\233e", -5.0271645960474665),
+                                    ("intersectd\233but de soir\233e", -5.0271645960474665),
+                                    ("aujourd'huifin de journ\233e", -5.0271645960474665),
+                                    ("intersectdu|dans le <part-of-day>", -3.235405126819411),
+                                    ("le <day-of-month> \224 <datetime>du|dans le <part-of-day>",
+                                     -4.621699487939302),
+                                    ("Lundifin d'apr\232s-midi", -4.621699487939302),
+                                    ("intersectd\233but d'apr\232s-midi", -5.0271645960474665),
+                                    ("le <time>d\233but d'apr\232s-midi", -5.0271645960474665),
+                                    ("<day-of-month> <named-month>du|dans le <part-of-day>",
+                                     -4.621699487939302),
+                                    ("Fevriermilieu d'apr\232s-midi", -5.0271645960474665),
+                                    ("Fevrierfin d'apr\232s-midi", -5.0271645960474665),
+                                    ("<day-of-month> <named-month>d\233but de soir\233e",
+                                     -5.0271645960474665),
+                                    ("hierdu|dans le <part-of-day>", -5.0271645960474665),
+                                    ("le <time>d\233but de soir\233e", -5.0271645960474665),
+                                    ("Fevrierfin de soir\233e", -5.0271645960474665),
+                                    ("intersectd\233but de journ\233e", -5.0271645960474665),
+                                    ("Fevriermilieu de matin\233e", -5.0271645960474665),
+                                    ("Fevrierfin de matin\233e", -5.0271645960474665),
+                                    ("le <time>d\233but de matin\233e", -5.0271645960474665),
+                                    ("<day-of-month> <named-month>milieu d'apr\232s-midi",
+                                     -5.0271645960474665),
+                                    ("<day-of-month> <named-month>fin d'apr\232s-midi",
+                                     -5.0271645960474665),
+                                    ("le <time>milieu de matin\233e", -5.0271645960474665),
+                                    ("aujourd'huid\233but de matin\233e", -3.9285523073793565),
+                                    ("Fevrierd\233but de soir\233e", -5.0271645960474665),
+                                    ("le <time>fin de soir\233e", -5.0271645960474665),
+                                    ("<day-of-month> <named-month>milieu de matin\233e",
+                                     -5.0271645960474665),
+                                    ("<day-of-month> <named-month>fin de soir\233e",
+                                     -5.0271645960474665),
+                                    ("<day-of-month> <named-month>fin de matin\233e",
+                                     -5.0271645960474665),
+                                    ("<time-of-day> heuresce <part-of-day>", -4.621699487939302),
+                                    ("aujourd'huid\233but d'apr\232s-midi", -5.0271645960474665),
+                                    ("le <time>milieu d'apr\232s-midi", -5.0271645960474665),
+                                    ("\224|vers <time-of-day>du|dans le <part-of-day>",
+                                     -3.9285523073793565),
+                                    ("Jeudimatin", -5.0271645960474665),
+                                    ("<day-of-month> <named-month>fin de journ\233e",
+                                     -5.0271645960474665),
+                                    ("<day-of-month> <named-month>milieu de journ\233e",
+                                     -5.0271645960474665),
+                                    ("le <time>fin de journ\233e", -5.0271645960474665),
+                                    ("Lundiapr\232s-midi", -5.0271645960474665),
+                                    ("intersectfin de matin\233e", -5.0271645960474665),
+                                    ("Fevrierd\233but de journ\233e", -5.0271645960474665),
+                                    ("intersectfin de soir\233e", -5.0271645960474665),
+                                    ("intersectmilieu de matin\233e", -5.0271645960474665),
+                                    ("intersectapr\232s-midi", -4.334017415487521),
+                                    ("Fevrierfin de journ\233e", -5.0271645960474665),
+                                    ("Fevriermilieu de journ\233e", -5.0271645960474665),
+                                    ("le <time>d\233but de journ\233e", -5.0271645960474665),
+                                    ("intersectd\233but de matin\233e", -5.0271645960474665),
+                                    ("hiersoir", -5.0271645960474665)],
+                               n = 110},
+                   koData =
+                     ClassData{prior = -2.3978952727983707, unseen = -4.68213122712422,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.5742165457937967),
+                                    ("<time-of-day> heuresdu|dans le <part-of-day>",
+                                     -3.2865344733420154),
+                                    ("le <time>du|dans le <part-of-day>", -3.5742165457937967),
+                                    ("aujourd'huidu|dans le <part-of-day>", -3.5742165457937967),
+                                    ("monthhour", -3.5742165457937967),
+                                    ("hourhour", -2.5933872927820705),
+                                    ("<time-of-day> - <time-of-day> (interval)du|dans le <part-of-day>",
+                                     -3.5742165457937967),
+                                    ("Fevrierdu|dans le <part-of-day>", -3.5742165457937967)],
+                               n = 11}}),
+       ("jour de l'an",
+        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}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.38348620138938916,
+                               unseen = -4.553876891600541,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.13657553500575073),
+                                    ("number (0..16)", -2.0583881324820035)],
+                               n = 92},
+                   koData =
+                     ClassData{prior = -1.144074662744867, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1431008436406733),
+                                    ("number (0..16)", -2.0149030205422647)],
+                               n = 43}}),
+       ("apr\232s-demain",
+        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}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.46262352194811296,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.9932517730102834,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 10}}),
+       ("<hour-of-day> et|pass\233 de <number> minutes",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224|vers <time-of-day>number (20..60)", -2.0794415416798357),
+                                    ("<time-of-day> heuresinteger (numeric)", -2.0794415416798357),
+                                    ("\224|vers <time-of-day>number (0..16)", -2.0794415416798357),
+                                    ("hour", -0.9808292530117262),
+                                    ("<time-of-day> heuresnumber (20..60)", -2.0794415416798357),
+                                    ("<time-of-day> heuresnumber (0..16)", -2.0794415416798357)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.580216829592325),
+                                    ("number (0..16)semaine (grain)", -3.0910424533583156),
+                                    ("number (0..16)ann\233e (grain)", -3.0910424533583156),
+                                    ("number (0..16)seconde (grain)", -3.4965075614664802),
+                                    ("number (0..16)jour (grain)", -3.4965075614664802),
+                                    ("second", -3.4965075614664802),
+                                    ("integer (numeric)ann\233e (grain)", -3.4965075614664802),
+                                    ("number (0..16)minute (grain)", -3.0910424533583156),
+                                    ("integer (numeric)jour (grain)", -3.0910424533583156),
+                                    ("day", -2.803360380906535), ("year", -2.803360380906535),
+                                    ("number (0..16)mois (grain)", -3.0910424533583156),
+                                    ("hour", -2.580216829592325),
+                                    ("number (0..16)heure (grain)", -3.0910424533583156),
+                                    ("month", -3.0910424533583156),
+                                    ("integer (numeric)minute (grain)", -2.803360380906535),
+                                    ("minute", -2.3978952727983707),
+                                    ("integer (numeric)semaine (grain)", -3.0910424533583156),
+                                    ("numbers 22..29 32..39 .. 52..59heure (grain)",
+                                     -3.4965075614664802),
+                                    ("integer (numeric)heure (grain)", -3.4965075614664802)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -4.48863636973214,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.784189633918261),
+                                    ("number (20..60)minute (grain)", -3.784189633918261),
+                                    ("number (0..16)jour (grain)", -3.0910424533583156),
+                                    ("integer (numeric)ann\233e (grain)", -3.784189633918261),
+                                    ("number (0..16)minute (grain)", -3.784189633918261),
+                                    ("day", -3.0910424533583156), ("year", -3.784189633918261),
+                                    ("hour", -1.2584609896100056),
+                                    ("number (0..16)heure (grain)", -1.9123874570166697),
+                                    ("month", -3.784189633918261),
+                                    ("integer (numeric)minute (grain)", -3.784189633918261),
+                                    ("integer (numeric)mois (grain)", -3.784189633918261),
+                                    ("minute", -3.0910424533583156),
+                                    ("integer (numeric)semaine (grain)", -3.784189633918261),
+                                    ("integer (numeric)heure (grain)", -1.9123874570166697)],
+                               n = 33}}),
+       ("avant-hier",
+        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}}),
+       ("d\233but de journ\233e",
+        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}}),
+       ("entre <time-of-day> et <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.1670540846631662,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -2.6741486494265287),
+                                    ("miditime-of-day (latent)", -2.6741486494265287),
+                                    ("minutehour", -0.9694005571881036),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -2.268683541318364),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -1.9810014688665833),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -1.9810014688665833),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -2.268683541318364)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.8718021769015913,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minutehour", -1.2992829841302609),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -1.7047480922384253),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -1.7047480922384253)],
+                               n = 2}}),
+       ("d\233but du mois",
+        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}}),
+       ("Jeudi",
+        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}}),
+       ("matin",
+        Classifier{okData =
+                     ClassData{prior = -0.7472144018302211,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -0.6418538861723948,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("en <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mars", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("maintenant",
+        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-week> 1er-<day-of-week> dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daydaymonth", -0.6931471805599453),
+                                    ("LundiMercrediJuillet", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Decembre",
+        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}}),
+       ("Septembre",
+        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}}),
+       ("Octobre",
+        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}}),
+       ("au d\233jeuner",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Novembre",
+        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}}),
+       ("Lundi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("le lendemain du <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.3862943611198906),
+                                    ("<day-of-month> <named-month>", -1.3862943611198906)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.6094379124341003),
+                                    ("time-of-day (latent)", -1.6094379124341003),
+                                    ("year", -1.6094379124341003), ("hour", -1.6094379124341003)],
+                               n = 2}}),
+       ("le <cycle> prochain|suivant|d'apr\232s",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.0608719606852628),
+                                    ("ann\233e (grain)", -3.258096538021482),
+                                    ("semaine (grain)", -1.0608719606852628),
+                                    ("mois (grain)", -2.8526314299133175),
+                                    ("day", -2.8526314299133175), ("year", -3.258096538021482),
+                                    ("jour (grain)", -2.8526314299133175),
+                                    ("month", -2.8526314299133175)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("apr\232s <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.9236708391717777, unseen = -4.219507705176107,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7197859696029658),
+                                    ("hh(:|h)mm (time-of-day)", -2.8183982582710754),
+                                    ("midi", -3.5115454388310208), ("day", -2.8183982582710754),
+                                    ("time-of-day (latent)", -2.8183982582710754),
+                                    ("hour", -1.4321038971511848), ("minute", -1.9021075263969205),
+                                    ("<time-of-day> heures", -2.8183982582710754),
+                                    ("le <time>", -3.1060803307228566),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -2.5952547069568657)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -0.5059356384717989, unseen = -4.564348191467836,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("demain", -3.1675825304806504),
+                                    ("intersect", -2.9444389791664407),
+                                    ("le <day-of-month> (non ordinal)", -3.8607297110405954),
+                                    ("midi", -1.3350010667323402), ("day", -2.9444389791664407),
+                                    ("time-of-day (latent)", -2.9444389791664407),
+                                    ("au d\233jeuner", -3.8607297110405954),
+                                    ("hour", -0.916290731874155),
+                                    ("<time-of-day> heures", -2.9444389791664407)],
+                               n = 41}}),
+       ("dd/-mm",
+        Classifier{okData =
+                     ClassData{prior = -0.7375989431307791,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.6505875661411494, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("minuit",
+        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}}),
+       ("entre dd et dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juillet", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mars",
+        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}}),
+       ("une <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -2.174751721484161, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.4849066497880004),
+                                    ("ann\233e (grain)", -2.4849066497880004),
+                                    ("seconde (grain)", -2.4849066497880004),
+                                    ("semaine (grain)", -2.4849066497880004),
+                                    ("second", -2.4849066497880004),
+                                    ("minute (grain)", -2.4849066497880004),
+                                    ("year", -2.4849066497880004),
+                                    ("heure (grain)", -2.4849066497880004),
+                                    ("hour", -2.4849066497880004), ("minute", -2.4849066497880004)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.12062798778861475,
+                               unseen = -4.532599493153256,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2636920390275583),
+                                    ("semaine (grain)", -1.2636920390275583),
+                                    ("mois (grain)", -2.91235066461494), ("day", -2.12389330425067),
+                                    ("jour (grain)", -2.12389330425067),
+                                    ("month", -2.91235066461494)],
+                               n = 39}}),
+       ("<hour-of-day> et quart",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midi", -1.9459101490553135),
+                                    ("\224|vers <time-of-day>", -1.540445040947149),
+                                    ("hour", -0.8472978603872037),
+                                    ("<time-of-day> heures", -1.540445040947149)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number (0..16)",
+        Classifier{okData =
+                     ClassData{prior = -0.2682639865946794, unseen = -3.713572066704308,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 39},
+                   koData =
+                     ClassData{prior = -1.4469189829363254, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("heure (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.540445040947149, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.2411620568168881,
+                               unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22}}),
+       ("<named-month|named-day> dernier|pass\233",
+        Classifier{okData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.791759469228055), ("Dimanche", -1.791759469228055)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -2.639057329615259),
+                                    ("en semaine", -2.2335922215070942),
+                                    ("day", -1.7227665977411035),
+                                    ("\224|vers <time-of-day>", -2.639057329615259),
+                                    ("time-of-day (latent)", -2.639057329615259),
+                                    ("year", -2.639057329615259), ("hour", -1.7227665977411035),
+                                    ("<time-of-day> heures", -2.2335922215070942),
+                                    ("le <time>", -2.2335922215070942)],
+                               n = 9}}),
+       ("milieu de journ\233e",
+        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}}),
+       ("dd/-mm/-yyyy",
+        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}}),
+       ("fin de semaine",
+        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 mm yyyy",
+        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}}),
+       ("fin du mois",
+        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 of month (premier)",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("jour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.2744368457017603, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                   koData =
+                     ClassData{prior = -1.4271163556401458,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("dd mm",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("Avril",
+        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}}),
+       ("dernier <cycle> de <time> (latent)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.4816045409242156),
+                                    ("semaine (grain)intersect", -1.9924301646902063),
+                                    ("jour (grain)Octobre", -1.9924301646902063),
+                                    ("weekmonth", -1.4816045409242156),
+                                    ("semaine (grain)Septembre", -1.9924301646902063),
+                                    ("jour (grain)intersect", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("milieu de matin\233e",
+        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}}),
+       ("avant le d\233jeuner",
+        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}}),
+       ("1er mai",
+        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}}),
+       ("fin de soir\233e",
+        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}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.9760099665757773, unseen = -4.442651256490317,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("demain<time-of-day> heures", -3.7376696182833684),
+                                    ("day of month (premier)<day-of-week> <day-of-month>",
+                                     -3.044522437723423),
+                                    ("dayhour", -3.332204510175204),
+                                    ("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
+                                     -3.332204510175204),
+                                    ("le <day-of-month> (non ordinal)<time-of-day> heures",
+                                     -3.7376696182833684),
+                                    ("minuteminute", -2.032921526044943),
+                                    ("<day-of-month> <named-month><day-of-month> <named-month>",
+                                     -3.332204510175204),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -3.044522437723423),
+                                    ("dayday", -1.8658674413817768),
+                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
+                                     -3.7376696182833684),
+                                    ("<day-of-month> <named-month>day of month (premier)",
+                                     -3.332204510175204),
+                                    ("minutehour", -3.332204510175204),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.7376696182833684),
+                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
+                                     -3.044522437723423),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.7376696182833684),
+                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
+                                     -3.332204510175204),
+                                    ("<day-of-month> <named-month>intersect", -3.332204510175204),
+                                    ("intersect<day-of-week> <day-of-month>", -3.332204510175204)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -0.47290638890369696, unseen = -4.77912349311153,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
+                                     -3.672072335797555),
+                                    ("monthday", -2.8247744754103516),
+                                    ("<day-of-week> <day-of-month>Dimanche", -3.672072335797555),
+                                    ("Juinintersect", -3.672072335797555),
+                                    ("minuteminute", -3.672072335797555),
+                                    ("dayday", -1.4384801142904609),
+                                    ("<day-of-week> <day-of-month><day-of-week> <day-of-month>",
+                                     -3.672072335797555),
+                                    ("day of month (premier)<day-of-month> <named-month>",
+                                     -4.07753744390572),
+                                    ("minutehour", -2.573460047129445),
+                                    ("Juillet<day-of-month> <named-month>", -3.672072335797555),
+                                    ("<day-of-week> <day-of-month>Mercredi", -4.07753744390572),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.3843902633457743),
+                                    ("day of month (premier)intersect", -2.8247744754103516),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.3843902633457743),
+                                    ("intersectintersect", -3.1612467120315646),
+                                    ("Juinday of month (premier)", -3.672072335797555),
+                                    ("hh(:|h)mm (time-of-day)intersect", -3.672072335797555),
+                                    ("day of month (premier)Mercredi", -3.3843902633457743),
+                                    ("intersectMercredi", -3.672072335797555),
+                                    ("<day-of-week> <day-of-month>intersect", -2.8247744754103516)],
+                               n = 43}}),
+       ("<day-of-month> <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.24256163717131135,
+                               unseen = -4.709530201312334,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Juin", -3.3141860046725258),
+                                    ("integer (numeric)Juillet", -3.0910424533583156),
+                                    ("integer (numeric)Octobre", -3.0910424533583156),
+                                    ("integer (numeric)Avril", -3.6018680771243066),
+                                    ("integer (numeric)Fevrier", -1.5649861498632667),
+                                    ("month", -0.7492366472109889),
+                                    ("integer (numeric)Septembre", -4.007333185232471),
+                                    ("integer (numeric)Mars", -1.927891643552635)],
+                               n = 51},
+                   koData =
+                     ClassData{prior = -1.5353299402803784,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Juillet", -1.0185695809945732),
+                                    ("month", -0.8754687373538999),
+                                    ("integer (numeric)Septembre", -2.890371757896165),
+                                    ("integer (numeric)Mars", -2.890371757896165)],
+                               n = 14}}),
+       ("Vendredi",
+        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}}),
+       ("<cycle> prochain|suivant|d'apr\232s",
+        Classifier{okData =
+                     ClassData{prior = -8.338160893905101e-2,
+                               unseen = -4.007333185232471,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.0986122886681098),
+                                    ("ann\233e (grain)", -3.295836866004329),
+                                    ("semaine (grain)", -1.0986122886681098),
+                                    ("mois (grain)", -2.890371757896165),
+                                    ("day", -2.6026896854443837), ("year", -3.295836866004329),
+                                    ("jour (grain)", -2.6026896854443837),
+                                    ("month", -2.890371757896165)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -2.5257286443082556,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mois (grain)", -1.791759469228055),
+                                    ("day", -1.791759469228055),
+                                    ("jour (grain)", -1.791759469228055),
+                                    ("month", -1.791759469228055)],
+                               n = 2}}),
+       ("fin <named-month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mars", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.2181574393178924, unseen = -4.060443010546419,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh(:|h)mm (time-of-day)<hour-of-day> <integer> (as relative minutes)",
+                                     -2.6567569067146595),
+                                    ("minuteminute", -1.3350010667323402),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -3.349904087274605),
+                                    ("<time-of-day> heures<time-of-day> heures",
+                                     -3.349904087274605),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -2.4336133554004498),
+                                    ("hourhour", -2.6567569067146595),
+                                    ("minutehour", -2.4336133554004498),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -2.6567569067146595),
+                                    ("<hour-of-day> <integer> (as relative minutes)hh(:|h)mm (time-of-day)",
+                                     -2.4336133554004498),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.349904087274605),
+                                    ("<hour-of-day> <integer> (as relative minutes)<hour-of-day> <integer> (as relative minutes)",
+                                     -2.6567569067146595),
+                                    ("<time-of-day> heurestime-of-day (latent)",
+                                     -3.349904087274605)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.35065687161316944,
+                               unseen = -4.7535901911063645,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)time-of-day (latent)",
+                                     -1.749199854809259),
+                                    ("hourhour", -1.310944923878104),
+                                    ("minutehour", -1.7004096906398272),
+                                    ("hh(:|h)mm (time-of-day)time-of-day (latent)",
+                                     -2.953172659135195),
+                                    ("<hour-of-day> <integer> (as relative minutes)<time-of-day> heures",
+                                     -3.1354942159291497),
+                                    ("hh(:|h)mm (time-of-day)<time-of-day> heures",
+                                     -3.1354942159291497),
+                                    ("<hour-of-day> <integer> (as relative minutes)time-of-day (latent)",
+                                     -2.665490586683414),
+                                    ("time-of-day (latent)<time-of-day> heures",
+                                     -2.26002547857525)],
+                               n = 50}}),
+       ("<named-day> en huit",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mercredi", -1.6739764335716716),
+                                    ("Mardi", -1.6739764335716716), ("day", -0.8266785731844679),
+                                    ("Lundi", -1.6739764335716716)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> et demi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midi", -1.6094379124341003),
+                                    ("\224|vers <time-of-day>", -1.6094379124341003),
+                                    ("hour", -0.916290731874155),
+                                    ("<time-of-day> heures", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dernier week-end de <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Septembre", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("du dd au dd(interval)",
+        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}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("avant <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.4469189829363254,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.791759469228055),
+                                    ("hour", -1.2809338454620642),
+                                    ("<time-of-day> heures", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.2682639865946794,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.890371757896165),
+                                    ("hh(:|h)mm (time-of-day)", -2.890371757896165),
+                                    ("hier", -2.890371757896165), ("day", -2.890371757896165),
+                                    ("time-of-day (latent)", -1.9740810260220096),
+                                    ("au d\233jeuner", -2.890371757896165),
+                                    ("hour", -1.1856236656577395), ("minute", -2.4849066497880004),
+                                    ("<time-of-day> heures", -1.9740810260220096),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -2.890371757896165)],
+                               n = 13}}),
+       ("fin d'apr\232s-midi",
+        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}}),
+       ("<part-of-day> du <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("matin<day-of-month> <named-month>", -1.0986122886681098),
+                                    ("hourday", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("matinyear (latent)", -1.0986122886681098),
+                                    ("houryear", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> heures",
+        Classifier{okData =
+                     ClassData{prior = -0.14805309995913976,
+                               unseen = -5.262690188904886,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.7576857016975165),
+                                    ("apr\232s <time-of-day>", -3.871201010907891),
+                                    ("hour", -0.7036184804272406),
+                                    ("avant <time-of-day>", -4.1588830833596715)],
+                               n = 94},
+                   koData =
+                     ClassData{prior = -1.9832976811269336,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.4469189829363254),
+                                    ("apr\232s <time-of-day>", -1.916922612182061),
+                                    ("hour", -0.7537718023763802),
+                                    ("avant <time-of-day>", -1.916922612182061)],
+                               n = 15}}),
+       ("week-end",
+        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}}),
+       ("le <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.22190054307461274,
+                               unseen = -5.855071922202427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5941059417529924),
+                                    ("<named-month|named-day> suivant|d'apr\232s",
+                                     -3.654977902438255),
+                                    ("<ordinal> <cycle> de <time>", -4.465908118654584),
+                                    ("premi\232re quinzaine de <named-month>(interval)",
+                                     -5.159055299214529),
+                                    ("intersect", -2.2146163200480884),
+                                    ("soir de no\235l", -5.159055299214529),
+                                    ("en semaine", -3.454307206976104),
+                                    ("toussaint", -4.7535901911063645),
+                                    ("day", -1.3089076975044704),
+                                    ("deuxi\232me quinzaine de <named-month>(interval)",
+                                     -5.159055299214529),
+                                    ("<dim time> <part-of-day>", -3.144152278672264),
+                                    ("dd/-mm", -3.906292330719161),
+                                    ("dd/-mm/-yyyy", -4.465908118654584),
+                                    ("dd mm yyyy", -3.906292330719161),
+                                    ("day of month (premier)", -3.906292330719161),
+                                    ("dd mm", -3.906292330719161), ("hour", -2.1386304130701665),
+                                    ("month", -4.465908118654584),
+                                    ("dernier <cycle> de <time> (latent)", -4.242764567340374),
+                                    ("<day-of-month> <named-month>", -2.5941059417529924),
+                                    ("<cycle> prochain|suivant|d'apr\232s", -2.8076800420510515),
+                                    ("dernier week-end de <time>", -5.159055299214529),
+                                    ("<ordinal> week-end de <time>", -4.7535901911063645),
+                                    ("<cycle> dernier", -4.060443010546419)],
+                               n = 161},
+                   koData =
+                     ClassData{prior = -1.6144254539451395, unseen = -4.672828834461907,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month|named-day> suivant|d'apr\232s",
+                                     -3.970291913552122),
+                                    ("intersect", -3.5648268054439574),
+                                    ("en semaine", -1.890850371872286), ("day", -1.367602228107738),
+                                    ("<dim time> <part-of-day>", -3.5648268054439574),
+                                    ("dd/-mm", -3.2771447329921766),
+                                    ("<named-month|named-day> dernier|pass\233",
+                                     -3.5648268054439574),
+                                    ("day of month (premier)", -3.970291913552122),
+                                    ("dd mm", -3.2771447329921766), ("hour", -1.955388893009857),
+                                    ("<day-of-month> <named-month>", -3.970291913552122),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.2655438213136967)],
+                               n = 40}}),
+       ("apr\232s le <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1}}),
+       ("n <cycle> passes|precedents",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("integer (numeric)ann\233e (grain)", -1.6094379124341003),
+                                    ("year", -1.6094379124341003),
+                                    ("integer (numeric)semaine (grain)", -1.6094379124341003)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("number (0..16)heure (grain)", -1.3862943611198906)],
+                               n = 1}}),
+       ("il y a <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8718021769015913), ("year", -1.8718021769015913),
+                                    ("<integer> <unit-of-duration>", -0.9555114450274363),
+                                    ("hour", -1.8718021769015913), ("month", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> week-end de <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (premier..seizieme)Septembre", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<dim time> du matin",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224|vers <time-of-day>", -1.466337068793427),
+                                    ("hour", -0.7731898882334817),
+                                    ("<time-of-day> heures", -1.1786549963416462)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("<time-of-day> heures", -0.916290731874155)],
+                               n = 1}}),
+       ("d\233but d'apr\232s-midi",
+        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}}),
+       ("<hour-of-day> <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = -8.961215868968717e-2,
+                               unseen = -4.31748811353631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuitnumber (0..16)", -3.20545280453606),
+                                    ("midinumber (20..60)", -3.6109179126442243),
+                                    ("\224|vers <time-of-day>number (20..60)", -3.6109179126442243),
+                                    ("<time-of-day> heuresinteger (numeric)", -1.16857087727502),
+                                    ("\224|vers <time-of-day>number (0..16)", -3.20545280453606),
+                                    ("midinumber (0..16)", -3.6109179126442243),
+                                    ("hour", -0.8075575317376895),
+                                    ("<time-of-day> heuresnumber (20..60)", -3.6109179126442243),
+                                    ("\224|vers <time-of-day>integer (numeric)",
+                                     -3.6109179126442243),
+                                    ("<time-of-day> heuresnumber (0..16)", -3.6109179126442243)],
+                               n = 32},
+                   koData =
+                     ClassData{prior = -2.456735772821304, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.3862943611198906),
+                                    ("\224|vers <time-of-day>integer (numeric)",
+                                     -1.6739764335716716),
+                                    ("<time-of-day> heuresnumber (0..16)", -2.0794415416798357)],
+                               n = 3}}),
+       ("<cycle> dernier",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9924301646902063),
+                                    ("ann\233e (grain)", -2.3978952727983707),
+                                    ("semaine (grain)", -1.9924301646902063),
+                                    ("mois (grain)", -2.3978952727983707),
+                                    ("day", -1.9924301646902063), ("year", -2.3978952727983707),
+                                    ("jour (grain)", -1.9924301646902063),
+                                    ("month", -2.3978952727983707)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("heure (grain)", -1.791759469228055),
+                                    ("hour", -1.791759469228055)],
+                               n = 1}}),
+       ("ce|dans le <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2992829841302609),
+                                    ("ann\233e (grain)", -2.3978952727983707),
+                                    ("semaine (grain)", -1.2992829841302609),
+                                    ("day", -1.9924301646902063), ("year", -2.3978952727983707),
+                                    ("jour (grain)", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dimanche",
+        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}}),
+       ("Fevrier",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ce <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("soir", -1.466337068793427), ("day", -1.8718021769015913),
+                                    ("Lundi", -1.8718021769015913), ("hour", -1.1786549963416462),
+                                    ("week-end", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/GA.hs b/Duckling/Ranking/Classifiers/GA.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/GA.hs
+++ /dev/null
@@ -1,155 +0,0 @@
--- 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.GA (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("integer (numeric)",
-        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}}),
-       ("ar\250 am\225rach",
-        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/mm",
-        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}}),
-       ("inniu",
-        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/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}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("<time> seo chugainn",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8266785731844679),
-                                    ("d\233 named-day", -2.0794415416798357),
-                                    ("named-day", -1.3862943611198906),
-                                    ("an named-day", -1.6739764335716716)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("d\233 named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("anois",
-        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}}),
-       ("named-day",
-        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}}),
-       ("an named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("am\225rach",
-        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}}),
-       ("inn\233",
-        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}}),
-       ("<time> seo",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.7985076962177716),
-                                    ("d\233 named-day", -2.3025850929940455),
-                                    ("named-day", -1.3862943611198906),
-                                    ("an named-day", -1.6094379124341003)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ar\250 inn\233",
-        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}})]
diff --git a/Duckling/Ranking/Classifiers/GA_XX.hs b/Duckling/Ranking/Classifiers/GA_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/GA_XX.hs
@@ -0,0 +1,156 @@
+-- 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.GA_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("Thursday",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("integer (numeric)",
+        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}}),
+       ("ar\250 am\225rach",
+        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/mm",
+        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}}),
+       ("inniu",
+        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}}),
+       ("Monday",
+        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}}),
+       ("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}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1}}),
+       ("<time> seo chugainn",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -1.3862943611198906), ("day", -0.8266785731844679),
+                                    ("d\233 named-day", -2.0794415416798357),
+                                    ("an named-day", -1.6739764335716716)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("d\233 named-day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("anois",
+        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}}),
+       ("an named-day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("am\225rach",
+        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}}),
+       ("inn\233",
+        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}}),
+       ("<time> seo",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -1.3862943611198906), ("day", -0.7985076962177716),
+                                    ("d\233 named-day", -2.3025850929940455),
+                                    ("an named-day", -1.6094379124341003)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ar\250 inn\233",
+        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}})]
diff --git a/Duckling/Ranking/Classifiers/HE.hs b/Duckling/Ranking/Classifiers/HE.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/HE.hs
+++ /dev/null
@@ -1,992 +0,0 @@
--- 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.HE (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -1.110882381259924, unseen = -3.367295829986474,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 27},
-                   koData =
-                     ClassData{prior = -0.3993860620317821, unseen = -4.04305126783455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 55}}),
-       ("\1489 <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.12783337150988489,
-                               unseen = -4.1588830833596715,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.044522437723423),
-                                    ("<time> <part-of-day>", -3.4499875458315876),
-                                    ("mm/dd", -3.4499875458315876),
-                                    ("intersect", -3.044522437723423),
-                                    ("named-month", -2.5336968139574325),
-                                    ("day", -2.1972245773362196),
-                                    ("this <cycle>", -3.4499875458315876),
-                                    ("time-of-day (latent)", -3.044522437723423),
-                                    ("<time-of-day> am|pm", -3.4499875458315876),
-                                    ("named-day", -3.044522437723423),
-                                    ("current <day-of-week>", -3.4499875458315876),
-                                    ("last <time>", -3.4499875458315876),
-                                    ("hour", -1.7452394535931621), ("month", -2.5336968139574325),
-                                    ("last <cycle>", -3.4499875458315876),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -3.4499875458315876),
-                                    ("week-end", -3.044522437723423),
-                                    ("this <time>", -3.044522437723423)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -2.120263536200091, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.5257286443082556), ("day", -2.120263536200091),
-                                    ("<day-of-month> (ordinal)", -2.5257286443082556),
-                                    ("month", -2.5257286443082556),
-                                    ("this <time>", -2.5257286443082556)],
-                               n = 3}}),
-       ("lunch",
-        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 (20..90)",
-        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> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.4213856809311607),
-                                    ("\1489 <date>morning", -2.6741486494265287),
-                                    ("yesterdayevening|night", -2.6741486494265287),
-                                    ("hourhour", -1.9810014688665833),
-                                    ("time-of-day (latent)morning", -2.6741486494265287),
-                                    ("named-daymorning", -2.6741486494265287),
-                                    ("todayevening|night", -2.6741486494265287),
-                                    ("tomorrowlunch", -2.268683541318364),
-                                    ("at <time-of-day>morning", -2.6741486494265287),
-                                    ("tomorrowevening|night", -2.6741486494265287)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -2.3025850929940455, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.8718021769015913),
-                                    ("<day-of-month> (ordinal)morning", -1.8718021769015913)],
-                               n = 1}}),
-       ("today",
-        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",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.0986122886681098),
-                                    ("<time-of-day> am|pm", -1.5040773967762742),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("<day-of-month> (non ordinal) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.8649974374866046),
-                                    ("month", -0.7472144018302211),
-                                    ("integer 3named-month", -2.2512917986064953)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal 4",
-        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}}),
-       ("\1489 <named-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (grain)",
-        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}}),
-       ("hour (grain)",
-        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}}),
-       ("ordinal 9",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("integer 21..99 (with and)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (20..90)integer 4", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -4.852030263919617,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -2.646962509122372),
-                                    ("daymonth", -3.2347491740244907),
-                                    ("monthyear", -3.7455747977904816),
-                                    ("the <day-of-month> (ordinal)in <named-month>",
-                                     -3.7455747977904816),
-                                    ("intersect<time-of-day> am|pm", -4.151039905898646),
-                                    ("<time> <part-of-day>\1489 <named-day>", -3.457892725338701),
-                                    ("intersect by \",\"<time-of-day> am|pm", -3.2347491740244907),
-                                    ("last <day-of-week> of <time>year", -4.151039905898646),
-                                    ("dayday", -2.7647455447787554),
-                                    ("the <day-of-month> (ordinal)\1489 <date>",
-                                     -3.7455747977904816),
-                                    ("dayyear", -2.359280436670591),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -3.7455747977904816),
-                                    ("\1489 <date>\1489 <named-day>", -4.151039905898646),
-                                    ("named-monthyear", -3.7455747977904816),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.151039905898646),
-                                    ("absorption of , after named day<day-of-month> (ordinal) of <named-month>",
-                                     -4.151039905898646),
-                                    ("<day-of-month> (ordinal) of <named-month>year",
-                                     -3.457892725338701),
-                                    ("named-daynext <cycle>", -4.151039905898646),
-                                    ("dayminute", -2.7647455447787554),
-                                    ("named-day<day-of-month> (ordinal) of <named-month>",
-                                     -4.151039905898646),
-                                    ("named-day\1489 <date>", -4.151039905898646),
-                                    ("absorption of , after named dayintersect",
-                                     -4.151039905898646),
-                                    ("named-day<day-of-month> (non ordinal) of <named-month>",
-                                     -4.151039905898646),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -3.7455747977904816),
-                                    ("year<time-of-day> am|pm", -4.151039905898646),
-                                    ("\1489 <date>\1489 <date>", -4.151039905898646),
-                                    ("<day-of-month> (non ordinal) of <named-month>year",
-                                     -3.457892725338701),
-                                    ("absorption of , after named day<day-of-month> (non ordinal) of <named-month>",
-                                     -4.151039905898646),
-                                    ("dayweek", -3.7455747977904816),
-                                    ("<time> <part-of-day>\1489 <date>", -3.457892725338701),
-                                    ("named-daythe <day-of-month> (ordinal)", -4.151039905898646),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -3.7455747977904816),
-                                    ("yearminute", -4.151039905898646)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -4.454347296253507,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("in <named-month>year", -3.7495040759303713),
-                                    ("dayhour", -3.3440389678222067),
-                                    ("year<hour-of-day> <integer>", -3.3440389678222067),
-                                    ("daymonth", -3.056356895370426),
-                                    ("monthyear", -2.6508917872622613),
-                                    ("intersecthh:mm", -3.7495040759303713),
-                                    ("dayday", -3.7495040759303713),
-                                    ("intersect by \",\"hh:mm", -2.833213344056216),
-                                    ("named-monthyear", -3.056356895370426),
-                                    ("absorption of , after named daynamed-month",
-                                     -3.7495040759303713),
-                                    ("named-dayin <named-month>", -3.7495040759303713),
-                                    ("dayminute", -2.3632097148104805),
-                                    ("named-day\1489 <date>", -3.7495040759303713),
-                                    ("absorption of , after named dayintersect",
-                                     -3.7495040759303713),
-                                    ("yearhh:mm", -3.7495040759303713),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -3.7495040759303713),
-                                    ("\1489 <date>year", -3.7495040759303713),
-                                    ("named-daythe <day-of-month> (ordinal)", -3.7495040759303713),
-                                    ("tomorrownoon", -3.3440389678222067),
-                                    ("yearminute", -3.056356895370426)],
-                               n = 21}}),
-       ("year (grain)",
-        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.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("month (grain)", -1.9459101490553135),
-                                    ("year (grain)", -1.9459101490553135),
-                                    ("week (grain)", -1.540445040947149),
-                                    ("year", -1.9459101490553135), ("month", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               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}}),
-       ("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}}),
-       ("evening|night",
-        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}}),
-       ("ordinal 3",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("yesterday",
-        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: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}}),
-       ("<day-of-month> (ordinal) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal 3named-month", -1.9459101490553135),
-                                    ("ordinal (digits)named-month", -0.9650808960435872),
-                                    ("month", -0.7419373447293773)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> and <integer>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer 4", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("quarter to|till|before <integer> (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}}),
-       ("<hour-of-day> <integer>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer 10", -1.7047480922384253),
-                                    ("time-of-day (latent)integer (numeric)", -1.0116009116784799),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4}}),
-       ("ordinal 19",
-        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}}),
-       ("named-month",
-        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}}),
-       ("week (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}}),
-       ("now",
-        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 11..19",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer 9integer 10", 0.0)],
-                               n = 1}}),
-       ("integer 7",
-        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>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal 3\1489 <date>", -1.7346010553881064),
-                                    ("ordinal (digits)in <named-month>", -2.1400661634962708),
-                                    ("month", -0.8873031950009028),
-                                    ("ordinal 3in <named-month>", -1.7346010553881064),
-                                    ("ordinal (digits)\1489 <date>", -2.1400661634962708)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 6}}),
-       ("tomorrow",
-        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 2",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        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 <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal 3", -1.252762968495368),
-                                    ("ordinal 19", -1.252762968495368),
-                                    ("ordinal (digits)", -1.252762968495368)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("ordinal 9", -0.916290731874155)],
-                               n = 1}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.6931471805599453),
-                                    ("week (grain)", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        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}}),
-       ("ordinal 7",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -1.2809338454620642,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.4700036292457356),
-                                    ("integer 9", -1.3862943611198906)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.325422400434628, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2876820724517809),
-                                    ("integer (20..90)", -2.0794415416798357),
-                                    ("integer 9", -2.0794415416798357)],
-                               n = 13}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("integer 9",
-        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}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.0986122886681098),
-                                    ("daymonth", -0.8109302162163288),
-                                    ("named-dayintersect", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer 21..99 (with and)hour (grain)", -2.3025850929940455),
-                                    ("day", -1.8971199848858813),
-                                    ("integer 7day (grain)", -1.8971199848858813),
-                                    ("hour", -1.8971199848858813),
-                                    ("integer (numeric)minute (grain)", -1.8971199848858813),
-                                    ("minute", -1.8971199848858813),
-                                    ("integer (numeric)hour (grain)", -2.3025850929940455)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -1.6094379124341003),
-                                    ("integer 4hour (grain)", -1.6094379124341003)],
-                               n = 1}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.3629054936893685,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\1489 <date>", -2.9444389791664407),
-                                    ("at <time-of-day>", -2.9444389791664407),
-                                    ("time-of-day (latent)", -2.2512917986064953),
-                                    ("hh:mm", -1.1526795099383855), ("hour", -1.845826690498331),
-                                    ("minute", -1.1526795099383855)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.1895840668738362, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 7}}),
-       ("integer 10",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.3794896217049037,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect by \",\"year", -3.044522437723423),
-                                    ("dayday", -2.128231705849268),
-                                    ("named-dayintersect by \",\"", -2.639057329615259),
-                                    ("dayyear", -2.128231705849268),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -3.044522437723423),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -3.044522437723423),
-                                    ("intersect by \",\"intersect", -3.044522437723423),
-                                    ("named-dayintersect", -3.044522437723423),
-                                    ("dayminute", -1.9459101490553135),
-                                    ("named-day<day-of-month> (ordinal) of <named-month>",
-                                     -3.044522437723423),
-                                    ("intersectyear", -3.044522437723423),
-                                    ("named-day<day-of-month> (non ordinal) of <named-month>",
-                                     -3.044522437723423),
-                                    ("intersectintersect", -3.044522437723423),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -2.639057329615259)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -1.1526795099383855, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -2.639057329615259),
-                                    ("daymonth", -2.639057329615259),
-                                    ("named-dayintersect by \",\"", -2.639057329615259),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -2.639057329615259),
-                                    ("intersect by \",\"intersect", -2.639057329615259),
-                                    ("named-dayintersect", -2.639057329615259),
-                                    ("dayminute", -1.540445040947149),
-                                    ("intersectintersect", -2.639057329615259)],
-                               n = 6}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -7.410797215372185e-2,
-                               unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -2.639057329615259, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = -3.7740327982847086e-2,
-                               unseen = -3.332204510175204,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
-                   koData =
-                     ClassData{prior = -3.295836866004329, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("ordinal 1",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("current <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\1489 <date>", -1.9459101490553135),
-                                    ("\1489 <named-day>", -1.9459101490553135),
-                                    ("day", -0.8472978603872037),
-                                    ("named-day", -1.252762968495368)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer 4",
-        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}}),
-       ("quarter of an hour",
-        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}}),
-       ("<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayordinal (digits)", -0.916290731874155),
-                                    ("day", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("absorption of , after named dayordinal (digits)",
-                                     -0.916290731874155),
-                                    ("day", -0.916290731874155)],
-                               n = 1}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal 6",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("integer 3",
-        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}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\1489 <date>", -1.791759469228055),
-                                    ("day", -1.791759469228055), ("named-day", -1.791759469228055),
-                                    ("hour", -1.3862943611198906),
-                                    ("week-end", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9808292530117262),
-                                    ("named-day", -1.6739764335716716),
-                                    ("<day-of-month> (ordinal)", -1.3862943611198906)],
-                               n = 5}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal 4", -1.7047480922384253),
-                                    ("ordinal 3", -1.7047480922384253),
-                                    ("ordinal 2", -1.0116009116784799),
-                                    ("ordinal 1", -1.2992829841302609)],
-                               n = 7}}),
-       ("noon",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.0986122886681098),
-                                    ("month", -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.916290731874155), ("named-day", -0.916290731874155)],
-                               n = 3}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.0986122886681098),
-                                    ("month (grain)", -1.791759469228055),
-                                    ("week (grain)", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal 20..90",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("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}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -2.3025850929940455),
-                                    ("half an hour", -2.3025850929940455),
-                                    ("<integer> <unit-of-duration>", -1.2039728043259361),
-                                    ("quarter of an hour", -2.3025850929940455),
-                                    ("hour", -1.8971199848858813), ("minute", -1.3862943611198906)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year<hour-of-day> <integer>", -0.6931471805599453),
-                                    ("yearminute", -0.6931471805599453)],
-                               n = 2}}),
-       ("in <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal 5",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("in <named-month>integer (numeric)", -2.1972245773362196),
-                                    ("\1489 <date>integer (numeric)", -2.1972245773362196),
-                                    ("named-monthinteger (numeric)", -1.0986122886681098),
-                                    ("month", -0.8109302162163288)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)in <named-month>", -1.8718021769015913),
-                                    ("integer 3\1489 <date>", -1.8718021769015913),
-                                    ("integer (numeric)\1489 <date>", -1.8718021769015913),
-                                    ("month", -0.9555114450274363),
-                                    ("integer 3in <named-month>", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal 3\1489 <date>", -1.252762968495368),
-                                    ("month", -0.8472978603872037),
-                                    ("ordinal 3in <named-month>", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("morning",
-        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}}),
-       ("week-end",
-        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 evening",
-        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 (grain)",
-        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.45198512374305727,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\1489 <date>", -1.9459101490553135),
-                                    ("\1489 <named-day>", -2.3513752571634776),
-                                    ("day", -1.252762968495368), ("named-day", -1.6582280766035324),
-                                    ("hour", -1.9459101490553135),
-                                    ("week-end", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.0116009116784799, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\1489 <date>", -2.0149030205422647),
-                                    ("day", -1.0986122886681098),
-                                    ("<day-of-month> (ordinal)", -1.3217558399823195)],
-                               n = 4}})]
diff --git a/Duckling/Ranking/Classifiers/HE_XX.hs b/Duckling/Ranking/Classifiers/HE_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/HE_XX.hs
@@ -0,0 +1,1051 @@
+-- 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.HE_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("\1502\1512\1509",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -1.110882381259924, unseen = -3.367295829986474,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 27},
+                   koData =
+                     ClassData{prior = -0.3993860620317821, unseen = -4.04305126783455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 55}}),
+       ("\1489 <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.12783337150988489,
+                               unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1502\1512\1509", -3.0757749812275272),
+                                    ("week", -3.0757749812275272),
+                                    ("<time> <part-of-day>", -3.481240089335692),
+                                    ("mm/dd", -3.481240089335692),
+                                    ("intersect", -3.0757749812275272), ("day", -2.228477120840324),
+                                    ("this <cycle>", -3.481240089335692),
+                                    ("time-of-day (latent)", -3.0757749812275272),
+                                    ("<time-of-day> am|pm", -3.481240089335692),
+                                    ("named-day", -3.0757749812275272),
+                                    ("current <day-of-week>", -3.481240089335692),
+                                    ("last <time>", -3.481240089335692),
+                                    ("\1488\1493\1511\1496\1493\1489\1512", -3.481240089335692),
+                                    ("hour", -1.7764919970972666), ("month", -2.5649493574615367),
+                                    ("\1508\1489\1512\1493\1488\1512", -3.481240089335692),
+                                    ("last <cycle>", -3.481240089335692),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -3.481240089335692),
+                                    ("week-end", -3.0757749812275272),
+                                    ("this <time>", -3.0757749812275272)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -2.120263536200091, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.6026896854443837),
+                                    ("day", -2.1972245773362196),
+                                    ("<day-of-month> (ordinal)", -2.6026896854443837),
+                                    ("month", -2.6026896854443837),
+                                    ("this <time>", -2.6026896854443837)],
+                               n = 3}}),
+       ("lunch",
+        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 (20..90)",
+        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> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.4213856809311607),
+                                    ("\1489 <date>morning", -2.6741486494265287),
+                                    ("yesterdayevening|night", -2.6741486494265287),
+                                    ("hourhour", -1.9810014688665833),
+                                    ("time-of-day (latent)morning", -2.6741486494265287),
+                                    ("named-daymorning", -2.6741486494265287),
+                                    ("todayevening|night", -2.6741486494265287),
+                                    ("tomorrowlunch", -2.268683541318364),
+                                    ("at <time-of-day>morning", -2.6741486494265287),
+                                    ("tomorrowevening|night", -2.6741486494265287)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.8718021769015913),
+                                    ("<day-of-month> (ordinal)morning", -1.8718021769015913)],
+                               n = 1}}),
+       ("today",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("<time-of-day> am|pm", -1.5040773967762742),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1}}),
+       ("<day-of-month> (non ordinal) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)\1502\1512\1509", -1.9459101490553135),
+                                    ("integer (numeric)\1508\1489\1512\1493\1488\1512",
+                                     -1.4350845252893227),
+                                    ("integer (numeric)\1488\1508\1512\1497\1500",
+                                     -2.3513752571634776),
+                                    ("integer 3\1502\1512\1509", -2.3513752571634776),
+                                    ("month", -0.8472978603872037)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("named-day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the ides of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1502\1512\1509", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal 4",
+        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}}),
+       ("\1489 <named-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("named-day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("month (grain)",
+        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}}),
+       ("hour (grain)",
+        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}}),
+       ("ordinal 9",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("integer 21..99 (with and)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (20..90)integer 4", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -4.867534450455582,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.662587827025453),
+                                    ("daymonth", -3.250374491927572),
+                                    ("monthyear", -3.7612001156935624),
+                                    ("the <day-of-month> (ordinal)in <named-month>",
+                                     -3.7612001156935624),
+                                    ("\1488\1493\1511\1496\1493\1489\1512year",
+                                     -4.1666652238017265),
+                                    ("intersect<time-of-day> am|pm", -4.1666652238017265),
+                                    ("<time> <part-of-day>\1489 <named-day>", -3.4735180432417816),
+                                    ("intersect by \",\"<time-of-day> am|pm", -3.250374491927572),
+                                    ("last <day-of-week> of <time>year", -4.1666652238017265),
+                                    ("dayday", -2.780370862681836),
+                                    ("the <day-of-month> (ordinal)\1489 <date>",
+                                     -3.7612001156935624),
+                                    ("dayyear", -2.374905754573672),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -3.7612001156935624),
+                                    ("\1489 <date>\1489 <named-day>", -4.1666652238017265),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.1666652238017265),
+                                    ("absorption of , after named day<day-of-month> (ordinal) of <named-month>",
+                                     -4.1666652238017265),
+                                    ("<day-of-month> (ordinal) of <named-month>year",
+                                     -3.4735180432417816),
+                                    ("named-daynext <cycle>", -4.1666652238017265),
+                                    ("dayminute", -2.780370862681836),
+                                    ("named-day<day-of-month> (ordinal) of <named-month>",
+                                     -4.1666652238017265),
+                                    ("named-day\1489 <date>", -4.1666652238017265),
+                                    ("absorption of , after named dayintersect",
+                                     -4.1666652238017265),
+                                    ("named-day<day-of-month> (non ordinal) of <named-month>",
+                                     -4.1666652238017265),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -3.7612001156935624),
+                                    ("year<time-of-day> am|pm", -4.1666652238017265),
+                                    ("\1489 <date>\1489 <date>", -4.1666652238017265),
+                                    ("<day-of-month> (non ordinal) of <named-month>year",
+                                     -3.4735180432417816),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) of <named-month>",
+                                     -4.1666652238017265),
+                                    ("dayweek", -3.7612001156935624),
+                                    ("\1502\1512\1509year", -4.1666652238017265),
+                                    ("<time> <part-of-day>\1489 <date>", -3.4735180432417816),
+                                    ("named-daythe <day-of-month> (ordinal)", -4.1666652238017265),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -3.7612001156935624),
+                                    ("yearminute", -4.1666652238017265)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -4.477336814478207,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("in <named-month>year", -3.7727609380946383),
+                                    ("dayhour", -3.367295829986474),
+                                    ("year<hour-of-day> <integer>", -3.367295829986474),
+                                    ("daymonth", -3.079613757534693),
+                                    ("monthyear", -2.6741486494265287),
+                                    ("intersecthh:mm", -3.7727609380946383),
+                                    ("dayday", -3.7727609380946383),
+                                    ("intersect by \",\"hh:mm", -2.856470206220483),
+                                    ("\1488\1508\1512\1497\1500year", -3.7727609380946383),
+                                    ("named-dayin <named-month>", -3.7727609380946383),
+                                    ("dayminute", -2.386466576974748),
+                                    ("named-day\1489 <date>", -3.7727609380946383),
+                                    ("absorption of , after named dayintersect",
+                                     -3.7727609380946383),
+                                    ("yearhh:mm", -3.7727609380946383),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -3.7727609380946383),
+                                    ("\1502\1512\1509year", -3.367295829986474),
+                                    ("\1489 <date>year", -3.7727609380946383),
+                                    ("named-daythe <day-of-month> (ordinal)", -3.7727609380946383),
+                                    ("absorption of , after named day\1497\1493\1500\1497",
+                                     -3.7727609380946383),
+                                    ("tomorrownoon", -3.367295829986474),
+                                    ("yearminute", -3.079613757534693)],
+                               n = 21}}),
+       ("year (grain)",
+        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.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149),
+                                    ("month (grain)", -1.9459101490553135),
+                                    ("year (grain)", -1.9459101490553135),
+                                    ("week (grain)", -1.540445040947149),
+                                    ("year", -1.9459101490553135), ("month", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               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}}),
+       ("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}}),
+       ("evening|night",
+        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}}),
+       ("ordinal 3",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("yesterday",
+        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: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}}),
+       ("<day-of-month> (ordinal) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal 3\1502\1512\1509", -2.4849066497880004),
+                                    ("ordinal (digits)\1502\1512\1509", -2.0794415416798357),
+                                    ("ordinal (digits)\1488\1508\1512\1497\1500",
+                                     -2.4849066497880004),
+                                    ("ordinal 3\1488\1493\1511\1496\1493\1489\1512",
+                                     -2.4849066497880004),
+                                    ("month", -0.8754687373538999),
+                                    ("ordinal (digits)\1508\1489\1512\1493\1488\1512",
+                                     -1.5686159179138452)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> and <integer>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)integer 4", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("quarter to|till|before <integer> (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}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)integer 10", -1.7047480922384253),
+                                    ("time-of-day (latent)integer (numeric)", -1.0116009116784799),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4}}),
+       ("ordinal 19",
+        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}}),
+       ("\1488\1493\1490\1493\1505\1496",
+        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}}),
+       ("\1488\1508\1512\1497\1500",
+        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}}),
+       ("week (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}}),
+       ("now",
+        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 11..19",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer 9integer 10", 0.0)],
+                               n = 1}}),
+       ("integer 7",
+        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>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal 3\1489 <date>", -1.7346010553881064),
+                                    ("ordinal (digits)in <named-month>", -2.1400661634962708),
+                                    ("month", -0.8873031950009028),
+                                    ("ordinal 3in <named-month>", -1.7346010553881064),
+                                    ("ordinal (digits)\1489 <date>", -2.1400661634962708)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\1497\1493\1500\1497",
+        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}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 6}}),
+       ("tomorrow",
+        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 2",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("named-day", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        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 <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal 3", -1.252762968495368),
+                                    ("ordinal 19", -1.252762968495368),
+                                    ("ordinal (digits)", -1.252762968495368)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("ordinal 9", -0.916290731874155)],
+                               n = 1}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("week (grain)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        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}}),
+       ("ordinal 7",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -1.2809338454620642,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("integer 9", -1.3862943611198906)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.325422400434628, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2876820724517809),
+                                    ("integer (20..90)", -2.0794415416798357),
+                                    ("integer 9", -2.0794415416798357)],
+                               n = 13}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("integer 9",
+        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}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8109302162163288),
+                                    ("named-dayintersect", -1.5040773967762742),
+                                    ("named-day\1502\1512\1509", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer 21..99 (with and)hour (grain)", -2.3025850929940455),
+                                    ("day", -1.8971199848858813),
+                                    ("integer 7day (grain)", -1.8971199848858813),
+                                    ("hour", -1.8971199848858813),
+                                    ("integer (numeric)minute (grain)", -1.8971199848858813),
+                                    ("minute", -1.8971199848858813),
+                                    ("integer (numeric)hour (grain)", -2.3025850929940455)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.6094379124341003),
+                                    ("integer 4hour (grain)", -1.6094379124341003)],
+                               n = 1}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.3629054936893685,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1489 <date>", -2.9444389791664407),
+                                    ("at <time-of-day>", -2.9444389791664407),
+                                    ("time-of-day (latent)", -2.2512917986064953),
+                                    ("hh:mm", -1.1526795099383855), ("hour", -1.845826690498331),
+                                    ("minute", -1.1526795099383855)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -1.1895840668738362, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 7}}),
+       ("integer 10",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.3794896217049037,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect by \",\"year", -3.044522437723423),
+                                    ("dayday", -2.128231705849268),
+                                    ("named-dayintersect by \",\"", -2.639057329615259),
+                                    ("dayyear", -2.128231705849268),
+                                    ("<named-month> <day-of-month> (non ordinal)intersect",
+                                     -3.044522437723423),
+                                    ("named-day<named-month> <day-of-month> (non ordinal)",
+                                     -3.044522437723423),
+                                    ("intersect by \",\"intersect", -3.044522437723423),
+                                    ("named-dayintersect", -3.044522437723423),
+                                    ("dayminute", -1.9459101490553135),
+                                    ("named-day<day-of-month> (ordinal) of <named-month>",
+                                     -3.044522437723423),
+                                    ("intersectyear", -3.044522437723423),
+                                    ("named-day<day-of-month> (non ordinal) of <named-month>",
+                                     -3.044522437723423),
+                                    ("intersectintersect", -3.044522437723423),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -2.639057329615259)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -1.1526795099383855, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.639057329615259),
+                                    ("named-dayintersect by \",\"", -2.639057329615259),
+                                    ("named-day\1497\1493\1500\1497", -2.639057329615259),
+                                    ("<named-month> <day-of-month> (non ordinal)intersect",
+                                     -2.639057329615259),
+                                    ("intersect by \",\"intersect", -2.639057329615259),
+                                    ("named-dayintersect", -2.639057329615259),
+                                    ("dayminute", -1.540445040947149),
+                                    ("intersectintersect", -2.639057329615259)],
+                               n = 6}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -7.410797215372185e-2,
+                               unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -2.639057329615259, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("named-day",
+        Classifier{okData =
+                     ClassData{prior = -3.7740327982847086e-2,
+                               unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
+                   koData =
+                     ClassData{prior = -3.295836866004329, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("ordinal 1",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("current <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1489 <date>", -1.9459101490553135),
+                                    ("\1489 <named-day>", -1.9459101490553135),
+                                    ("day", -0.8472978603872037),
+                                    ("named-day", -1.252762968495368)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer 4",
+        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}}),
+       ("quarter of an hour",
+        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}}),
+       ("<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("named-dayordinal (digits)", -0.916290731874155),
+                                    ("day", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("absorption of , after named dayordinal (digits)",
+                                     -0.916290731874155),
+                                    ("day", -0.916290731874155)],
+                               n = 1}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal 6",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("integer 3",
+        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}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1489 <date>", -1.791759469228055),
+                                    ("day", -1.791759469228055), ("named-day", -1.791759469228055),
+                                    ("hour", -1.3862943611198906),
+                                    ("week-end", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.9808292530117262),
+                                    ("named-day", -1.6739764335716716),
+                                    ("<day-of-month> (ordinal)", -1.3862943611198906)],
+                               n = 5}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal 4", -1.7047480922384253),
+                                    ("ordinal 3", -1.7047480922384253),
+                                    ("ordinal 2", -1.0116009116784799),
+                                    ("ordinal 1", -1.2992829841302609)],
+                               n = 7}}),
+       ("\1488\1493\1511\1496\1493\1489\1512",
+        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}}),
+       ("noon",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("\1508\1489\1512\1493\1488\1512",
+        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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1502\1512\1509", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.916290731874155), ("named-day", -0.916290731874155)],
+                               n = 3}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.0986122886681098),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("week (grain)", -1.0986122886681098),
+                                    ("month", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal 20..90",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.3025850929940455),
+                                    ("half an hour", -2.3025850929940455),
+                                    ("<integer> <unit-of-duration>", -1.2039728043259361),
+                                    ("quarter of an hour", -2.3025850929940455),
+                                    ("hour", -1.8971199848858813), ("minute", -1.3862943611198906)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year<hour-of-day> <integer>", -0.6931471805599453),
+                                    ("yearminute", -0.6931471805599453)],
+                               n = 2}}),
+       ("in <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1502\1512\1509", -1.3862943611198906),
+                                    ("\1488\1493\1511\1496\1493\1489\1512", -1.791759469228055),
+                                    ("month", -0.8754687373538999),
+                                    ("\1508\1489\1512\1493\1488\1512", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal 5",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("in <named-month>integer (numeric)", -2.3978952727983707),
+                                    ("\1502\1512\1509integer (numeric)", -2.3978952727983707),
+                                    ("\1489 <date>integer (numeric)", -2.3978952727983707),
+                                    ("\1508\1489\1512\1493\1488\1512integer (numeric)",
+                                     -2.3978952727983707),
+                                    ("\1488\1493\1490\1493\1505\1496integer (numeric)",
+                                     -2.3978952727983707),
+                                    ("\1488\1508\1512\1497\1500integer (numeric)",
+                                     -2.3978952727983707),
+                                    ("\1497\1493\1500\1497integer (numeric)", -2.3978952727983707),
+                                    ("month", -1.0116009116784799)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)in <named-month>", -1.8718021769015913),
+                                    ("integer 3\1489 <date>", -1.8718021769015913),
+                                    ("integer (numeric)\1489 <date>", -1.8718021769015913),
+                                    ("month", -0.9555114450274363),
+                                    ("integer 3in <named-month>", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal 3\1489 <date>", -1.252762968495368),
+                                    ("month", -0.8472978603872037),
+                                    ("ordinal 3in <named-month>", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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 evening",
+        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 (grain)",
+        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.45198512374305727,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1489 <date>", -1.9459101490553135),
+                                    ("\1489 <named-day>", -2.3513752571634776),
+                                    ("day", -1.252762968495368), ("named-day", -1.6582280766035324),
+                                    ("hour", -1.9459101490553135),
+                                    ("week-end", -2.3513752571634776)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.0116009116784799, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\1489 <date>", -2.0149030205422647),
+                                    ("day", -1.0986122886681098),
+                                    ("<day-of-month> (ordinal)", -1.3217558399823195)],
+                               n = 4}})]
diff --git a/Duckling/Ranking/Classifiers/HR.hs b/Duckling/Ranking/Classifiers/HR.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/HR.hs
+++ /dev/null
@@ -1,1849 +0,0 @@
--- 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.HR (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -1.7047480922384253),
-                                    ("intersect", -1.7047480922384253),
-                                    ("hh:mm", -1.7047480922384253), ("hour", -1.7047480922384253),
-                                    ("minute", -1.2992829841302609)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.9697794168251413, unseen = -4.532599493153256,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 91},
-                   koData =
-                     ClassData{prior = -0.4766926173965321, unseen = -5.017279836814924,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 149}}),
-       ("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}}),
-       ("lunch",
-        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 (20..90)",
-        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}}),
-       ("few",
-        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}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.3184537311185346, unseen = -5.19295685089021,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> o'clockmorning", -4.4942386252808095),
-                                    ("until <time-of-day>afternoon", -4.4942386252808095),
-                                    ("dayhour", -2.7894905330423847),
-                                    ("time-of-day (latent)late night", -3.801091444720864),
-                                    ("time-of-day (latent)evening|night", -4.088773517172645),
-                                    ("<time-of-day> o'clockevening|night", -4.4942386252808095),
-                                    ("<time-of-day> o'clocktonight", -4.4942386252808095),
-                                    ("<hour-of-day> halfafternoon", -4.4942386252808095),
-                                    ("time-of-day (latent)tonight", -4.088773517172645),
-                                    ("yesterdayevening|night", -4.4942386252808095),
-                                    ("hourhour", -1.4497161875573867),
-                                    ("at <time-of-day>afternoon", -3.3956263366127),
-                                    ("minutehour", -2.5483284762254965),
-                                    ("<time-of-day> o'clockafternoon", -4.4942386252808095),
-                                    ("intersectafternoon", -4.4942386252808095),
-                                    ("time-of-day (latent)morning", -4.4942386252808095),
-                                    ("named-daymorning", -4.4942386252808095),
-                                    ("todayevening|night", -4.4942386252808095),
-                                    ("named-dayearly morning", -3.801091444720864),
-                                    ("at <time-of-day>late night", -3.801091444720864),
-                                    ("hh:mmearly morning", -4.4942386252808095),
-                                    ("<day-of-month>(ordinal) <named-month>morning",
-                                     -4.4942386252808095),
-                                    ("half <integer> (HR style hour-of-day)afternoon",
-                                     -4.088773517172645),
-                                    ("numeral after|past (hour-of-day)afternoon",
-                                     -4.4942386252808095),
-                                    ("quarter after|past (hour-of-day)afternoon",
-                                     -4.4942386252808095),
-                                    ("<time-of-day> o'clocklate night", -4.088773517172645),
-                                    ("tomorrowlunch", -4.4942386252808095),
-                                    ("todaytonight", -4.4942386252808095),
-                                    ("time-of-day (latent)afternoon", -3.2414756567854415),
-                                    ("intersectmorning", -3.2414756567854415),
-                                    ("about <time-of-day>afternoon", -3.801091444720864),
-                                    ("hh:mmafternoon", -3.2414756567854415),
-                                    ("between <datetime> and <datetime> (interval)morning",
-                                     -4.4942386252808095),
-                                    ("between <time-of-day> and <time-of-day> (interval)morning",
-                                     -4.4942386252808095),
-                                    ("at <time-of-day>morning", -4.4942386252808095),
-                                    ("tomorrowevening|night", -4.4942386252808095)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -1.2992829841302609, unseen = -4.605170185988091,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> o'clockmorning", -3.9019726695746444),
-                                    ("dayhour", -3.4965075614664802),
-                                    ("yearhour", -3.4965075614664802),
-                                    ("named-daylate night", -3.9019726695746444),
-                                    ("monthhour", -3.4965075614664802),
-                                    ("by <time>afternoon", -3.9019726695746444),
-                                    ("after <time-of-day>morning", -3.9019726695746444),
-                                    ("hourhour", -2.1972245773362196),
-                                    ("until <time-of-day>morning", -3.9019726695746444),
-                                    ("since <time-of-day>morning", -3.9019726695746444),
-                                    ("minutehour", -2.649209701079277),
-                                    ("time-of-day (latent)morning", -3.9019726695746444),
-                                    ("year (latent)afternoon", -3.4965075614664802),
-                                    ("by <time>morning", -3.9019726695746444),
-                                    ("numeral to|till|before <integer> (hour-of-day)morning",
-                                     -3.9019726695746444),
-                                    ("named-monthmorning", -3.9019726695746444),
-                                    ("secondhour", -3.4965075614664802),
-                                    ("time-of-day (latent)afternoon", -2.515678308454754),
-                                    ("intersectmorning", -3.4965075614664802),
-                                    ("<duration> after <time>afternoon", -3.9019726695746444),
-                                    ("named-monthlate night", -3.9019726695746444),
-                                    ("<day-of-month>(ordinal) <named-month>late night",
-                                     -3.9019726695746444)],
-                               n = 24}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = -1.1526795099383855,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.3794896217049037, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662, unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> o'clock", -2.2823823856765264),
-                                    ("time-of-day (latent)", -1.1192315758708455),
-                                    ("hh:mm", -2.505525936990736), ("hour", -0.8960880245566356),
-                                    ("minute", -2.505525936990736)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -1.8718021769015913, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.9555114450274363),
-                                    ("hour", -0.9555114450274363)],
-                               n = 4}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.7282385003712154),
-                                    ("named-day", -0.8823891801984737),
-                                    ("u <named-day>", -2.268683541318364)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.15822400521489416,
-                               unseen = -3.6109179126442243,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 35},
-                   koData =
-                     ClassData{prior = -1.9218125974762528,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6061358035703156,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
-       ("between <datetime> and <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.1526795099383855),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.2512917986064953),
-                                    ("hh:mmhh:mm", -1.1526795099383855),
-                                    ("hourhour", -2.2512917986064953)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.3437347467010947),
-                                    ("minuteminute", -1.749199854809259),
-                                    ("minutehour", -1.3437347467010947),
-                                    ("hh:mmintersect", -1.749199854809259)],
-                               n = 8}}),
-       ("month (grain)",
-        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}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = -0.7308875085427924,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.8870696490323797),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("until <time-of-day>", -2.803360380906535),
-                                    ("hour", -0.8574502318512216)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -0.6567795363890705, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> quarter", -2.8622008809294686),
-                                    ("time-of-day (latent)", -0.9903987040278769),
-                                    ("hour", -0.916290731874155), ("minute", -2.8622008809294686),
-                                    ("after <time-of-day>", -2.8622008809294686)],
-                               n = 14}}),
-       ("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}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.8690378470236094, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -0.5436154465889815, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.2992829841302609),
-                                    ("ordinals (first..19th)quarter (grain)", -1.2992829841302609),
-                                    ("quarter", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
-                                    ("ordinals (first..19th)quarter (grain)", -1.252762968495368),
-                                    ("quarter", -0.8472978603872037)],
-                               n = 2}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.5133540701193493, unseen = -6.049733455231958,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("u <named-day><day-of-month>(ordinal) <named-month>",
-                                     -5.354224998486333),
-                                    ("hourday", -4.948759890378168),
-                                    ("dd.mm<time-of-day> o'clock", -5.354224998486333),
-                                    ("dayhour", -2.680076349059804),
-                                    ("daymonth", -3.5624655292582776),
-                                    ("u <named-day><named-month> <day-of-month> (ordinal)",
-                                     -5.354224998486333),
-                                    ("monthyear", -3.6494769062479073),
-                                    ("christmasyear", -5.354224998486333),
-                                    ("u <named-day><time-of-day> o'clock", -5.354224998486333),
-                                    ("<time> <part-of-day>u <named-day>", -3.9679306373664422),
-                                    ("intersectat <time-of-day>", -5.354224998486333),
-                                    ("day before yesterdayat <time-of-day>", -4.661077817926388),
-                                    ("between <time-of-day> and <time-of-day> (interval)u <named-day>",
-                                     -4.661077817926388),
-                                    ("between <datetime> and <datetime> (interval)u <named-day>",
-                                     -4.661077817926388),
-                                    ("last <cycle>u <named-day>", -5.354224998486333),
-                                    ("<time-of-day> o'clocktonight", -5.354224998486333),
-                                    ("from <datetime> - <datetime> (interval)u <named-day>",
-                                     -5.354224998486333),
-                                    ("today<time> <part-of-day>", -4.948759890378168),
-                                    ("todayat <time-of-day>", -5.354224998486333),
-                                    ("from <time-of-day> - <time-of-day> (interval)u <named-day>",
-                                     -5.354224998486333),
-                                    ("next <cycle>u <named-day>", -5.354224998486333),
-                                    ("named-dayhh:mm", -5.354224998486333),
-                                    ("dayday", -3.1029331998798373),
-                                    ("hourhour", -5.354224998486333),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.948759890378168),
-                                    ("intersectnamed-month", -4.437934266612178),
-                                    ("dayyear", -3.8501476017100584),
-                                    ("named-dayu <named-month>", -4.948759890378168),
-                                    ("<time-of-day> o'clocktomorrow", -5.354224998486333),
-                                    ("<time-of-day> - <time-of-day> (interval)u <named-day>",
-                                     -4.437934266612178),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.948759890378168),
-                                    ("<datetime> - <datetime> (interval)u <named-day>",
-                                     -4.437934266612178),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -3.9679306373664422),
-                                    ("day after tomorrow<time> <part-of-day>", -5.354224998486333),
-                                    ("minutemonth", -4.437934266612178),
-                                    ("day after tomorrowat <time-of-day>", -4.948759890378168),
-                                    ("absorption of , after named day<named-month> <day-of-month> (ordinal)",
-                                     -4.437934266612178),
-                                    ("named-day<time> timezone", -5.354224998486333),
-                                    ("named-monthyear", -3.8501476017100584),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.948759890378168),
-                                    ("this <cycle>u <named-day>", -4.948759890378168),
-                                    ("last <day-of-week> <time>year", -4.948759890378168),
-                                    ("dd.mmat <time-of-day>", -4.948759890378168),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -4.437934266612178),
-                                    ("intersect<named-month> <day-of-month> (ordinal)",
-                                     -4.948759890378168),
-                                    ("named-daynext <cycle>", -5.354224998486333),
-                                    ("named-dayintersect", -5.354224998486333),
-                                    ("day before yesterday<time-of-day> o'clock",
-                                     -5.354224998486333),
-                                    ("<time> <part-of-day><named-day> <day-of-month> (ordinal)",
-                                     -4.437934266612178),
-                                    ("dayminute", -3.274783456806497),
-                                    ("u <named-day>at <time-of-day>", -4.948759890378168),
-                                    ("<time> <part-of-day>intersect", -3.4824228215847413),
-                                    ("u <named-day><time> <part-of-day>", -4.948759890378168),
-                                    ("intersectyear", -5.354224998486333),
-                                    ("<ordinal> <cycle> of <time>year", -5.354224998486333),
-                                    ("minuteday", -2.0583881324820035),
-                                    ("absorption of , after named dayintersect",
-                                     -5.354224998486333),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.661077817926388),
-                                    ("<time> <part-of-day>intersect by \",\"", -4.437934266612178),
-                                    ("named-day<time> <part-of-day>", -4.437934266612178),
-                                    ("named-dayat <time-of-day>", -4.948759890378168),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.661077817926388),
-                                    ("intersect by \",\"at <time-of-day>", -4.437934266612178),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -4.255612709818223),
-                                    ("yearat <time-of-day>", -5.354224998486333),
-                                    ("<time> <part-of-day>absorption of , after named day",
-                                     -4.661077817926388),
-                                    ("todaytonight", -5.354224998486333),
-                                    ("weekday", -4.437934266612178),
-                                    ("named-day<time-of-day> o'clock", -5.354224998486333),
-                                    ("dayweek", -5.354224998486333),
-                                    ("weekyear", -4.948759890378168),
-                                    ("<named-day> <day-of-month> (ordinal)named-month",
-                                     -3.8501476017100584),
-                                    ("u <named-day><named-month> <day-of-month> (non ordinal)",
-                                     -5.354224998486333),
-                                    ("u <named-month>year", -4.948759890378168),
-                                    ("last <cycle> of <time>year", -4.948759890378168),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -5.354224998486333),
-                                    ("yearminute", -5.354224998486333)],
-                               n = 158},
-                   koData =
-                     ClassData{prior = -0.9125100090342491, unseen = -5.768320995793772,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("since <time-of-day>by <time>", -4.378896741664954),
-                                    ("year<time-of-day> - <time-of-day> (interval)",
-                                     -5.072043922224899),
-                                    ("hourday", -4.155753190350744),
-                                    ("dayhour", -3.200241745323308),
-                                    ("named-monthnamed-day", -3.9734316335567894),
-                                    ("daymonth", -2.9319777587286286),
-                                    ("monthday", -3.6857495611050086),
-                                    ("monthyear", -3.462606009790799),
-                                    ("yearhour", -4.666578814116735),
-                                    ("named-month<hour-of-day> <integer> (as relative minutes)",
-                                     -5.072043922224899),
-                                    ("hh:mmu <named-day>", -3.9734316335567894),
-                                    ("last <time>today", -4.378896741664954),
-                                    ("intersectat <time-of-day>", -5.072043922224899),
-                                    ("named-daysince <time-of-day>", -4.155753190350744),
-                                    ("until <time-of-day>u <named-day>", -5.072043922224899),
-                                    ("since <time-of-day>u <named-day>", -4.666578814116735),
-                                    ("<time> <part-of-day>named-day", -5.072043922224899),
-                                    ("dayday", -3.9734316335567894),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.072043922224899),
-                                    ("named-monthnamed-month", -4.378896741664954),
-                                    ("monthmonth", -4.155753190350744),
-                                    ("hourhour", -5.072043922224899),
-                                    ("intersectnamed-month", -4.666578814116735),
-                                    ("dayyear", -4.378896741664954),
-                                    ("named-dayu <named-month>", -4.155753190350744),
-                                    ("<time-of-day> - <time-of-day> (interval)u <named-day>",
-                                     -5.072043922224899),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -4.666578814116735),
-                                    ("monthminute", -4.666578814116735),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -5.072043922224899),
-                                    ("minutemonth", -4.666578814116735),
-                                    ("absorption of , after named day<named-month> <day-of-month> (ordinal)",
-                                     -5.072043922224899),
-                                    ("intersect<time-of-day> - <time-of-day> (interval)",
-                                     -5.072043922224899),
-                                    ("named-monthyear", -4.378896741664954),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.378896741664954),
-                                    ("absorption of , after named daynamed-month",
-                                     -3.9734316335567894),
-                                    ("intersect by \",\"<time-of-day> - <time-of-day> (interval)",
-                                     -4.155753190350744),
-                                    ("named-dayafter <time-of-day>", -4.155753190350744),
-                                    ("named-dayintersect", -4.378896741664954),
-                                    ("dayminute", -3.0571409016826343),
-                                    ("<time> <part-of-day>intersect", -4.666578814116735),
-                                    ("intersectyear", -4.155753190350744),
-                                    ("after <time-of-day>by <time>", -4.378896741664954),
-                                    ("minuteday", -3.0571409016826343),
-                                    ("absorption of , after named dayintersect",
-                                     -5.072043922224899),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.666578814116735),
-                                    ("named-monthnumeral to|till|before <integer> (hour-of-day)",
-                                     -5.072043922224899),
-                                    ("<time> <part-of-day>intersect by \",\"", -5.072043922224899),
-                                    ("named-day<time> <part-of-day>", -4.666578814116735),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.666578814116735),
-                                    ("intersect by \",\"at <time-of-day>", -4.155753190350744),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -5.072043922224899),
-                                    ("yearat <time-of-day>", -5.072043922224899),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -4.666578814116735),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -4.666578814116735),
-                                    ("u <named-day>named-month", -5.072043922224899),
-                                    ("<named-day> <day-of-month> (ordinal)named-month",
-                                     -5.072043922224899),
-                                    ("after <time-of-day>u <named-day>", -4.666578814116735),
-                                    ("named-monthintersect", -5.072043922224899),
-                                    ("hh:mmby <time>", -4.378896741664954),
-                                    ("u <named-month>year", -3.9734316335567894),
-                                    ("minutesecond", -3.462606009790799),
-                                    ("yearminute", -4.666578814116735)],
-                               n = 106}}),
-       ("early morning",
-        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> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7047480922384253),
-                                    ("ordinals (first..19th)week (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("ordinals (first..19th)day (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("ordinals (first..19th)week (grain)intersect",
-                                     -1.7047480922384253),
-                                    ("weekmonth", -1.2992829841302609)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("season",
-        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}}),
-       ("year (grain)",
-        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}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.252762968495368),
-                                    ("hh:mmhh:mm", -1.252762968495368)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.5040773967762742),
-                                    ("minuteminute", -1.5040773967762742),
-                                    ("minutehour", -1.5040773967762742),
-                                    ("hh:mmintersect", -1.5040773967762742)],
-                               n = 2}}),
-       ("day before 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}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.7047480922384253),
-                                    ("month (grain)", -1.9924301646902063),
-                                    ("year (grain)", -2.3978952727983707),
-                                    ("week (grain)", -1.7047480922384253),
-                                    ("quarter", -2.3978952727983707), ("year", -2.3978952727983707),
-                                    ("month", -1.9924301646902063),
-                                    ("quarter (grain)", -2.3978952727983707)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               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 = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
-                                    ("minutehour", -1.0986122886681098)],
-                               n = 1}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("yyyy-mm-dd",
-        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}}),
-       ("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}}),
-       ("prije <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003), ("day", -1.8971199848858813),
-                                    ("year", -2.3025850929940455),
-                                    ("<integer> <unit-of-duration>", -0.916290731874155),
-                                    ("month", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>", -1.3862943611198906),
-                                    ("hour", -1.3862943611198906)],
-                               n = 1}}),
-       ("evening|night",
-        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}}),
-       ("dd/mm/yyyy",
-        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}}),
-       ("yesterday",
-        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}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.8472978603872037),
-                                    ("ordinals (first..19th)quarter (grain)year",
-                                     -1.252762968495368),
-                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after lunch",
-        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}}),
-       ("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}}),
-       ("numeral to|till|before <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (0..19)noon", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.1823215567939546, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7731898882334817),
-                                    ("integer (numeric)time-of-day (latent)", -0.7731898882334817)],
-                               n = 5}}),
-       ("quarter to|till|before <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon", -0.6931471805599453), ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a pair",
-        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> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7884573603642702),
-                                    ("ordinals (first..19th)named-dayintersect",
-                                     -1.0116009116784799),
-                                    ("ordinals (first..19th)named-daynamed-month",
-                                     -1.7047480922384253)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("ordinals (first..19th)named-daynamed-month",
-                                     -0.8109302162163288)],
-                               n = 3}}),
-       ("<hour-of-day> quarter",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = -0.25593337413720063,
-                               unseen = -3.912023005428146,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 48},
-                   koData =
-                     ClassData{prior = -1.488077055429833, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
-       ("week (grain)",
-        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}}),
-       ("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}}),
-       ("last <day-of-week> <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.6739764335716716),
-                                    ("daymonth", -0.8266785731844679),
-                                    ("named-dayu <named-month>", -1.6739764335716716),
-                                    ("named-dayintersect", -1.6739764335716716)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        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}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("evening|night", -1.8718021769015913),
-                                    ("afternoon", -1.466337068793427),
-                                    ("hour", -0.9555114450274363),
-                                    ("morning", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -1.252762968495368),
-                                    ("late night", -1.252762968495368)],
-                               n = 1}}),
-       ("<day-of-month>(ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -4.652001563489282e-2,
-                               unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)named-month", -0.916290731874155),
-                                    ("month", -0.7156200364120039),
-                                    ("ordinals (first..19th)named-month", -2.1972245773362196)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -3.0910424533583156, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)named-month", -0.916290731874155),
-                                    ("month", -0.916290731874155)],
-                               n = 1}}),
-       ("numbers i",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods =
-                                 HashMap.fromList [("integer (20..90)integer (0..19)", 0.0)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 11}}),
-       ("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.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.3862943611198906),
-                                    ("day", -1.3862943611198906),
-                                    ("named-day", -1.3862943611198906),
-                                    ("month", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -1.5040773967762742),
-                                    ("midnight|EOD|end of day", -1.5040773967762742)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -2.740840023925201),
-                                    ("time-of-day (latent)", -1.488077055429833),
-                                    ("hh:mm", -2.0476928433652555), ("noon", -2.3353749158170367),
-                                    ("hour", -1.2367626271489267), ("minute", -1.824549292051046)],
-                               n = 12}}),
-       ("half an hour",
-        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}}),
-       ("afternoon",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> from now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>", -0.8472978603872037),
-                                    ("minute", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.8718021769015913),
-                                    ("month (grain)", -2.5649493574615367),
-                                    ("year (grain)", -2.5649493574615367),
-                                    ("week (grain)", -1.8718021769015913),
-                                    ("day", -2.5649493574615367), ("quarter", -2.159484249353372),
-                                    ("year", -2.5649493574615367), ("month", -2.5649493574615367),
-                                    ("quarter (grain)", -2.159484249353372),
-                                    ("day (grain)", -2.5649493574615367)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        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}}),
-       ("<hour-of-day> half",
-        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}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.7047480922384253),
-                                    ("time-of-day (latent)", -1.0116009116784799),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.8109302162163288),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.9444616088408514, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2231435513142097),
-                                    ("integer (0..19)", -2.0794415416798357)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -0.49247648509779407,
-                               unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.4307829160924542),
-                                    ("integer (20..90)", -2.995732273553991),
-                                    ("few", -3.4011973816621555),
-                                    ("integer (0..19)", -1.455287232606842),
-                                    ("a pair", -3.4011973816621555)],
-                               n = 55}}),
-       ("for <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.11441035117774422,
-                               unseen = -4.3694478524670215,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9704144655697013),
-                                    ("three-quarters of an hour", -2.7472709142554916),
-                                    ("number.number hours", -3.6635616461296463),
-                                    ("second", -3.6635616461296463), ("day", -2.5649493574615367),
-                                    ("half an hour", -2.5649493574615367),
-                                    ("year", -3.6635616461296463),
-                                    ("<integer> <unit-of-duration>", -1.221214610760442),
-                                    ("hour", -2.4107986776342782), ("month", -3.6635616461296463),
-                                    ("minute", -1.5234954826333758),
-                                    ("about <duration>", -3.6635616461296463)],
-                               n = 33},
-                   koData =
-                     ClassData{prior = -2.2246235515243336, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>", -1.3862943611198906),
-                                    ("hour", -1.3862943611198906)],
-                               n = 4}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.2006706954621511, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -1.7047480922384253, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -4.5217885770490405,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.5649493574615367),
-                                    ("integer (0..19)year (grain)", -3.1245651453969594),
-                                    ("integer (numeric)day (grain)", -2.431417964837014),
-                                    ("integer (0..19)hour (grain)", -3.817712325956905),
-                                    ("second", -3.817712325956905),
-                                    ("a pairhour (grain)", -3.817712325956905),
-                                    ("integer (numeric)year (grain)", -3.817712325956905),
-                                    ("day", -2.3136349291806306), ("year", -2.9014215940827497),
-                                    ("integer (numeric)week (grain)", -3.817712325956905),
-                                    ("integer (0..19)month (grain)", -3.41224721784874),
-                                    ("integer (0..19)second (grain)", -3.817712325956905),
-                                    ("hour", -2.5649493574615367), ("month", -3.41224721784874),
-                                    ("integer (numeric)minute (grain)", -2.7191000372887952),
-                                    ("integer (0..19)minute (grain)", -3.817712325956905),
-                                    ("fewhour (grain)", -3.817712325956905),
-                                    ("minute", -2.5649493574615367),
-                                    ("integer (numeric)hour (grain)", -3.1245651453969594),
-                                    ("integer (0..19)day (grain)", -3.817712325956905),
-                                    ("integer (0..19)week (grain)", -2.7191000372887952)],
-                               n = 33},
-                   koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -4.912654885736052,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.959364629383116),
-                                    ("integer (0..19)year (grain)", -3.8066624897703196),
-                                    ("integer (numeric)day (grain)", -3.518980417318539),
-                                    ("fewday (grain)", -4.212127597878484),
-                                    ("integer (0..19)hour (grain)", -2.959364629383116),
-                                    ("second", -3.295836866004329),
-                                    ("numbers ihour (grain)", -3.8066624897703196),
-                                    ("integer (numeric)second (grain)", -3.8066624897703196),
-                                    ("integer (numeric)year (grain)", -3.8066624897703196),
-                                    ("day", -2.959364629383116), ("year", -3.295836866004329),
-                                    ("integer (numeric)week (grain)", -3.295836866004329),
-                                    ("integer (0..19)month (grain)", -3.8066624897703196),
-                                    ("integer (0..19)second (grain)", -3.8066624897703196),
-                                    ("hour", -1.5730702682632256), ("month", -3.295836866004329),
-                                    ("integer (numeric)minute (grain)", -3.8066624897703196),
-                                    ("integer (0..19)minute (grain)", -3.8066624897703196),
-                                    ("integer (numeric)month (grain)", -3.8066624897703196),
-                                    ("minute", -3.295836866004329),
-                                    ("integer (numeric)hour (grain)", -1.9095425048844386),
-                                    ("integer (0..19)day (grain)", -3.8066624897703196),
-                                    ("integer (0..19)week (grain)", -3.8066624897703196)],
-                               n = 55}}),
-       ("ordinals (first..19th)",
-        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}}),
-       ("<duration> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>christmas", -1.7047480922384253),
-                                    ("yearday", -1.7047480922384253),
-                                    ("minutesecond", -1.7047480922384253),
-                                    ("<integer> <unit-of-duration>now", -1.7047480922384253)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter of an hourtime-of-day (latent)", -1.7047480922384253),
-                                    ("minutehour", -1.2992829841302609),
-                                    ("quarter of an hour<time> <part-of-day>",
-                                     -1.7047480922384253)],
-                               n = 2}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.820281565605037,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("u <named-day><day-of-month>(ordinal) <named-month>",
-                                     -4.119037174812472),
-                                    ("<named-month> <day-of-month> (ordinal)intersect",
-                                     -4.119037174812472),
-                                    ("u <named-day><named-month> <day-of-month> (ordinal)",
-                                     -4.119037174812472),
-                                    ("intersecthh:mm", -4.119037174812472),
-                                    ("intersect by \",\"year", -3.713572066704308),
-                                    ("dayday", -2.0395956331326364),
-                                    ("intersect by \",\"hh:mm", -3.202746442938317),
-                                    ("intersect by \",\"intersect by \",\"", -4.119037174812472),
-                                    ("named-dayintersect by \",\"", -3.0204248861443626),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.119037174812472),
-                                    ("named-day<named-month> <day-of-month> (ordinal)",
-                                     -3.4258899942525267),
-                                    ("dayyear", -2.7327428136925813),
-                                    ("<named-month> <day-of-month> (ordinal)intersect by \",\"",
-                                     -4.119037174812472),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.119037174812472),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -4.119037174812472),
-                                    ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -3.713572066704308),
-                                    ("intersect<named-month> <day-of-month> (ordinal)",
-                                     -4.119037174812472),
-                                    ("intersect by \",\"intersect", -4.119037174812472),
-                                    ("named-dayintersect", -4.119037174812472),
-                                    ("intersectintersect by \",\"", -4.119037174812472),
-                                    ("dayminute", -2.0395956331326364),
-                                    ("intersectyear", -3.713572066704308),
-                                    ("minuteday", -3.202746442938317),
-                                    ("yearhh:mm", -4.119037174812472),
-                                    ("intersectintersect", -4.119037174812472),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -2.866274206317104),
-                                    ("u <named-day><named-month> <day-of-month> (non ordinal)",
-                                     -4.119037174812472),
-                                    ("<named-month> <day-of-month> (ordinal)year",
-                                     -3.713572066704308),
-                                    ("yearminute", -4.119037174812472)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -1.2039728043259361, unseen = -4.330733340286331,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -2.70805020110221),
-                                    ("hourday", -3.624340932976365),
-                                    ("<named-month> <day-of-month> (ordinal)intersect",
-                                     -3.624340932976365),
-                                    ("dayhour", -2.5257286443082556),
-                                    ("daymonth", -2.5257286443082556),
-                                    ("monthyear", -3.624340932976365),
-                                    ("dayday", -2.5257286443082556),
-                                    ("named-dayintersect by \",\"", -3.624340932976365),
-                                    ("named-day<named-month> <day-of-month> (ordinal)",
-                                     -3.624340932976365),
-                                    ("intersectnamed-month", -3.624340932976365),
-                                    ("minutemonth", -3.624340932976365),
-                                    ("at <time-of-day><day-of-month>(ordinal) <named-month>",
-                                     -3.624340932976365),
-                                    ("named-monthyear", -3.624340932976365),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -2.9311937524164198),
-                                    ("intersect by \",\"intersect", -3.624340932976365),
-                                    ("named-dayintersect", -3.624340932976365),
-                                    ("intersectintersect", -3.624340932976365),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -3.624340932976365),
-                                    ("u <named-day>named-month", -3.624340932976365)],
-                               n = 18}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -2.7398974188114388e-2,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -3.6109179126442243,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = -1.4815085785140587e-2,
-                               unseen = -4.23410650459726,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 67},
-                   koData =
-                     ClassData{prior = -4.219507705176107, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter of an hour",
-        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}}),
-       ("second (grain)",
-        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}}),
-       ("u <named-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("absorption of , after named day", -2.3978952727983707),
-                                    ("day", -0.723918839226699),
-                                    ("named-day", -0.8574502318512216)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("absorption of , after named dayordinal (digits)",
-                                     -1.0116009116784799),
-                                    ("named-dayordinal (digits)", -2.3978952727983707),
-                                    ("day", -0.7884573603642702),
-                                    ("u <named-day>ordinal (digits)", -2.3978952727983707)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -2.3025850929940455,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("absorption of , after named dayordinal (digits)",
-                                     -1.0986122886681098),
-                                    ("day", -1.0986122886681098)],
-                               n = 1}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.7047480922384253, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("evening|night", -2.0149030205422647),
-                                    ("day", -1.6094379124341003),
-                                    ("named-day", -1.6094379124341003),
-                                    ("hour", -1.6094379124341003),
-                                    ("week-end", -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.2006706954621511, unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> o'clock", -3.068052935133617),
-                                    ("time-of-day (latent)", -0.8708283577973976),
-                                    ("hour", -0.8167611365271219)],
-                               n = 18}}),
-       ("since <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -2.772588722239781, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mm", -1.7047480922384253),
-                                    ("minute", -1.7047480922384253)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -3.6888794541139363,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -2.9704144655697013),
-                                    ("intersect", -1.8718021769015913),
-                                    ("second", -2.0541237336955462),
-                                    ("numeral to|till|before <integer> (hour-of-day)",
-                                     -2.9704144655697013),
-                                    ("now", -2.9704144655697013), ("hh:mm", -2.277267285009756),
-                                    ("<datetime> - <datetime> (interval)", -2.5649493574615367),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.5649493574615367),
-                                    ("minute", -1.1786549963416462)],
-                               n = 15}}),
-       ("noon",
-        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}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> o'clock", -1.8718021769015913),
-                                    ("time-of-day (latent)", -1.466337068793427),
-                                    ("hour", -1.1786549963416462)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -2.3513752571634776),
-                                    ("hh:mm", -1.6582280766035324), ("noon", -1.9459101490553135),
-                                    ("hour", -1.4350845252893227),
-                                    ("midnight|EOD|end of day", -2.3513752571634776),
-                                    ("minute", -1.6582280766035324)],
-                               n = 7}}),
-       ("<integer> and an half hours",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (0..19)", 0.0)],
-                               n = 1}}),
-       ("after <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("late night",
-        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}}),
-       ("midnight|EOD|end of 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 <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -2.3025850929940455),
-                                    ("day", -1.0498221244986778),
-                                    ("named-day", -1.0498221244986778),
-                                    ("month", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> o'clock", -1.2039728043259361),
-                                    ("hour", -1.2039728043259361)],
-                               n = 2}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("month (grain)", -2.3025850929940455),
-                                    ("year (grain)", -1.8971199848858813),
-                                    ("week (grain)", -1.3862943611198906),
-                                    ("year", -1.8971199848858813), ("month", -2.3025850929940455)],
-                               n = 7},
-                   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.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6026896854443837),
-                                    ("integer (0..19)year (grain)", -3.295836866004329),
-                                    ("integer (numeric)day (grain)", -3.295836866004329),
-                                    ("fewday (grain)", -3.295836866004329),
-                                    ("integer (0..19)hour (grain)", -3.295836866004329),
-                                    ("second", -2.890371757896165),
-                                    ("integer (numeric)second (grain)", -3.295836866004329),
-                                    ("integer (numeric)year (grain)", -3.295836866004329),
-                                    ("day", -2.6026896854443837), ("year", -2.890371757896165),
-                                    ("integer (numeric)week (grain)", -2.890371757896165),
-                                    ("integer (0..19)month (grain)", -3.295836866004329),
-                                    ("integer (0..19)second (grain)", -3.295836866004329),
-                                    ("hour", -2.890371757896165), ("month", -2.890371757896165),
-                                    ("integer (numeric)minute (grain)", -3.295836866004329),
-                                    ("integer (0..19)minute (grain)", -3.295836866004329),
-                                    ("integer (numeric)month (grain)", -3.295836866004329),
-                                    ("minute", -2.890371757896165),
-                                    ("integer (numeric)hour (grain)", -3.295836866004329),
-                                    ("integer (0..19)day (grain)", -3.295836866004329),
-                                    ("integer (0..19)week (grain)", -3.295836866004329)],
-                               n = 16},
-                   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 = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("today", -2.0794415416798357),
-                                    ("next <cycle>", -2.0794415416798357),
-                                    ("day", -1.3862943611198906),
-                                    ("this <cycle>", -1.6739764335716716),
-                                    ("month", -1.6739764335716716),
-                                    ("this <time>", -2.0794415416798357)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.343805421853684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9444389791664407),
-                                    ("three-quarters of an hour", -2.7212954278522306),
-                                    ("number.number hours", -3.6375861597263857),
-                                    ("second", -3.6375861597263857), ("day", -2.538973871058276),
-                                    ("half an hour", -2.538973871058276),
-                                    ("year", -3.6375861597263857),
-                                    ("<integer> <unit-of-duration>", -1.2396908869280152),
-                                    ("hour", -2.384823191231018), ("month", -3.6375861597263857),
-                                    ("minute", -1.55814461804655),
-                                    ("about <duration>", -3.6375861597263857)],
-                               n = 32},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("since <time-of-day>hh:mm", -2.6741486494265287),
-                                    ("minuteminute", -1.4213856809311607),
-                                    ("hh:mmhh:mm", -1.7578579175523736),
-                                    ("dayday", -2.268683541318364),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -2.268683541318364),
-                                    ("after <time-of-day>hh:mm", -2.6741486494265287)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.268683541318364),
-                                    ("minuteminute", -1.7578579175523736),
-                                    ("after <time-of-day>intersect", -2.6741486494265287),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -2.268683541318364),
-                                    ("hh:mmintersect", -2.268683541318364),
-                                    ("since <time-of-day>intersect", -2.6741486494265287),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -2.268683541318364),
-                                    ("yearminute", -2.268683541318364)],
-                               n = 8}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("since <time-of-day>hh:mm", -2.4423470353692043),
-                                    ("minuteminute", -1.1895840668738362),
-                                    ("hh:mmhh:mm", -1.5260563034950494),
-                                    ("after <time-of-day>hh:mm", -2.4423470353692043)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.4700036292457356,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("since <time-of-day>time-of-day (latent)", -2.740840023925201),
-                                    ("hh:mmtime-of-day (latent)", -1.824549292051046),
-                                    ("hourhour", -2.740840023925201),
-                                    ("minutehour", -1.1314021114911006),
-                                    ("numeral to|till|before <integer> (hour-of-day)time-of-day (latent)",
-                                     -2.0476928433652555),
-                                    ("at <time-of-day>time-of-day (latent)", -2.740840023925201),
-                                    ("after <time-of-day>time-of-day (latent)",
-                                     -2.740840023925201)],
-                               n = 10}}),
-       ("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}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.70805020110221),
-                                    ("integer (0..19)year (grain)", -3.4011973816621555),
-                                    ("integer (numeric)day (grain)", -2.995732273553991),
-                                    ("integer (0..19)hour (grain)", -3.4011973816621555),
-                                    ("second", -2.995732273553991),
-                                    ("numbers ihour (grain)", -2.995732273553991),
-                                    ("integer (numeric)second (grain)", -3.4011973816621555),
-                                    ("integer (numeric)year (grain)", -3.4011973816621555),
-                                    ("day", -2.70805020110221), ("year", -2.995732273553991),
-                                    ("integer (numeric)week (grain)", -2.995732273553991),
-                                    ("integer (0..19)month (grain)", -3.4011973816621555),
-                                    ("integer (0..19)second (grain)", -3.4011973816621555),
-                                    ("hour", -2.3025850929940455), ("month", -2.995732273553991),
-                                    ("integer (numeric)minute (grain)", -3.4011973816621555),
-                                    ("integer (0..19)minute (grain)", -3.4011973816621555),
-                                    ("integer (numeric)month (grain)", -3.4011973816621555),
-                                    ("minute", -2.995732273553991),
-                                    ("integer (numeric)hour (grain)", -2.995732273553991),
-                                    ("integer (0..19)day (grain)", -3.4011973816621555),
-                                    ("integer (0..19)week (grain)", -3.4011973816621555)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
-                               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..19th)named-dayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..19th)named-daychristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.6061358035703156, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.7884573603642702,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 5}}),
-       ("numeral after|past (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("integer (20..90)time-of-day (latent)", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -3.7740327982847086e-2,
-                               unseen = -3.332204510175204,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
-                   koData =
-                     ClassData{prior = -3.295836866004329, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter (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}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.540445040947149),
-                                    ("week (grain)named-month", -1.9459101490553135),
-                                    ("day (grain)intersect", -1.9459101490553135),
-                                    ("weekmonth", -1.540445040947149),
-                                    ("day (grain)named-month", -1.9459101490553135),
-                                    ("week (grain)intersect", -1.9459101490553135)],
-                               n = 4},
-                   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 = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)named-month", -1.0986122886681098),
-                                    ("month", -0.8109302162163288),
-                                    ("ordinals (first..19th)named-month", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("morning",
-        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}}),
-       ("half <integer> (HR style 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}}),
-       ("week-end",
-        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}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -2.890371757896165, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mm", -1.9459101490553135),
-                                    ("minute", -1.9459101490553135)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -5.715841383994864e-2,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -3.1354942159291497),
-                                    ("<time-of-day> o'clock", -3.1354942159291497),
-                                    ("intersect", -2.03688192726104),
-                                    ("second", -2.2192034840549946),
-                                    ("numeral to|till|before <integer> (hour-of-day)",
-                                     -3.1354942159291497),
-                                    ("now", -3.1354942159291497),
-                                    ("time-of-day (latent)", -3.1354942159291497),
-                                    ("hh:mm", -2.4423470353692043), ("hour", -2.7300291078209855),
-                                    ("<datetime> - <datetime> (interval)", -2.7300291078209855),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.7300291078209855),
-                                    ("minute", -1.3437347467010947)],
-                               n = 17}}),
-       ("day (grain)",
-        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}}),
-       ("dd.mm",
-        Classifier{okData =
-                     ClassData{prior = -1.8718021769015913,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.1670540846631662,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
-       ("day after tomorrow",
-        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}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -1.6094379124341003),
-                                    ("quarter of an hour", -1.0986122886681098),
-                                    ("minute", -0.7621400520468967)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter of an hour", -0.7884573603642702),
-                                    ("minute", -0.7884573603642702)],
-                               n = 4}}),
-       ("u <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.7884573603642702,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.6061358035703156, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 6}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (numeric)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 4}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("today", -2.772588722239781), ("season", -2.0794415416798357),
-                                    ("evening|night", -2.772588722239781),
-                                    ("day", -1.5198257537444133), ("afternoon", -2.772588722239781),
-                                    ("named-day", -2.367123614131617),
-                                    ("hour", -1.6739764335716716), ("morning", -2.772588722239781),
-                                    ("week-end", -2.367123614131617)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.8718021769015913, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.9459101490553135),
-                                    ("named-day", -1.9459101490553135),
-                                    ("hour", -1.9459101490553135),
-                                    ("late night", -1.9459101490553135)],
-                               n = 2}}),
-       ("<named-month> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month", -0.6931471805599453),
-                                    ("named-monthordinal (digits)", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/HR_XX.hs b/Duckling/Ranking/Classifiers/HR_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/HR_XX.hs
@@ -0,0 +1,1971 @@
+-- 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.HR_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -1.7047480922384253),
+                                    ("intersect", -1.7047480922384253),
+                                    ("hh:mm", -1.7047480922384253), ("hour", -1.7047480922384253),
+                                    ("minute", -1.2992829841302609)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        Classifier{okData =
+                     ClassData{prior = -7.410797215372185e-2,
+                               unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -2.639057329615259, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.9697794168251413, unseen = -4.532599493153256,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 91},
+                   koData =
+                     ClassData{prior = -0.4766926173965321, unseen = -5.017279836814924,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 149}}),
+       ("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}}),
+       ("lunch",
+        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 (20..90)",
+        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}}),
+       ("few",
+        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}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -5.214935757608986,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> o'clockmorning", -4.516338972281476),
+                                    ("until <time-of-day>afternoon", -4.516338972281476),
+                                    ("dayhour", -2.8115908800430502),
+                                    ("time-of-day (latent)late night", -3.82319179172153),
+                                    ("time-of-day (latent)evening|night", -4.110873864173311),
+                                    ("<time-of-day> o'clockevening|night", -4.516338972281476),
+                                    ("Mondayearly morning", -3.82319179172153),
+                                    ("<time-of-day> o'clocktonight", -4.516338972281476),
+                                    ("<hour-of-day> halfafternoon", -4.516338972281476),
+                                    ("time-of-day (latent)tonight", -4.110873864173311),
+                                    ("yesterdayevening|night", -4.516338972281476),
+                                    ("hourhour", -1.4482860371478585),
+                                    ("at <time-of-day>afternoon", -3.417726683613366),
+                                    ("minutehour", -2.501435951739211),
+                                    ("<time-of-day> o'clockafternoon", -4.516338972281476),
+                                    ("intersectafternoon", -4.516338972281476),
+                                    ("time-of-day (latent)morning", -4.516338972281476),
+                                    ("todayevening|night", -4.516338972281476),
+                                    ("at <time-of-day>late night", -3.82319179172153),
+                                    ("hh:mmearly morning", -4.516338972281476),
+                                    ("<day-of-month>(ordinal) <named-month>morning",
+                                     -4.516338972281476),
+                                    ("half <integer> (HR style hour-of-day)afternoon",
+                                     -4.110873864173311),
+                                    ("numeral after|past (hour-of-day)afternoon",
+                                     -4.516338972281476),
+                                    ("quarter after|past (hour-of-day)afternoon",
+                                     -4.516338972281476),
+                                    ("<time-of-day> o'clocklate night", -4.110873864173311),
+                                    ("tomorrowlunch", -4.516338972281476),
+                                    ("todaytonight", -4.516338972281476),
+                                    ("time-of-day (latent)afternoon", -3.130044611161585),
+                                    ("intersectmorning", -3.2635760037861075),
+                                    ("about <time-of-day>afternoon", -3.82319179172153),
+                                    ("<duration> after <time>afternoon", -4.516338972281476),
+                                    ("Mondaymorning", -4.516338972281476),
+                                    ("hh:mmafternoon", -3.2635760037861075),
+                                    ("between <datetime> and <datetime> (interval)morning",
+                                     -4.516338972281476),
+                                    ("between <time-of-day> and <time-of-day> (interval)morning",
+                                     -4.516338972281476),
+                                    ("at <time-of-day>morning", -4.516338972281476),
+                                    ("tomorrowevening|night", -4.516338972281476)],
+                               n = 66},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -4.564348191467836,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> o'clockmorning", -3.8607297110405954),
+                                    ("Februarylate night", -3.8607297110405954),
+                                    ("dayhour", -3.455264602932431),
+                                    ("yearhour", -3.455264602932431),
+                                    ("monthhour", -3.455264602932431),
+                                    ("by <time>afternoon", -3.8607297110405954),
+                                    ("after <time-of-day>morning", -3.8607297110405954),
+                                    ("hourhour", -2.2512917986064953),
+                                    ("until <time-of-day>morning", -3.8607297110405954),
+                                    ("since <time-of-day>morning", -3.8607297110405954),
+                                    ("minutehour", -2.762117422372486),
+                                    ("time-of-day (latent)morning", -3.8607297110405954),
+                                    ("year (latent)afternoon", -3.455264602932431),
+                                    ("Februarymorning", -3.8607297110405954),
+                                    ("by <time>morning", -3.8607297110405954),
+                                    ("numeral to|till|before <integer> (hour-of-day)morning",
+                                     -3.8607297110405954),
+                                    ("secondhour", -3.455264602932431),
+                                    ("Mondaylate night", -3.8607297110405954),
+                                    ("time-of-day (latent)afternoon", -2.6079667425452278),
+                                    ("intersectmorning", -3.455264602932431),
+                                    ("<day-of-month>(ordinal) <named-month>late night",
+                                     -3.8607297110405954)],
+                               n = 22}}),
+       ("today",
+        Classifier{okData =
+                     ClassData{prior = -1.1526795099383855,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.3794896217049037, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.1670540846631662, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> o'clock", -2.2823823856765264),
+                                    ("time-of-day (latent)", -1.1192315758708455),
+                                    ("hh:mm", -2.505525936990736), ("hour", -0.8960880245566356),
+                                    ("minute", -2.505525936990736)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -1.8718021769015913, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9555114450274363),
+                                    ("hour", -0.9555114450274363)],
+                               n = 4}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.803360380906535),
+                                    ("Saturday", -2.803360380906535),
+                                    ("Monday", -1.8870696490323797),
+                                    ("Friday", -2.1102132003465894), ("day", -0.8574502318512216),
+                                    ("Sunday", -2.3978952727983707),
+                                    ("u <named-day>", -2.3978952727983707)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.15822400521489416,
+                               unseen = -3.6109179126442243,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 35},
+                   koData =
+                     ClassData{prior = -1.9218125974762528,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6061358035703156,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hh:mmhh:mm", -1.0986122886681098),
+                                    ("hourhour", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
+                                    ("minutehour", -0.9808292530117262)],
+                               n = 5}}),
+       ("between <datetime> and <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.1526795099383855),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.2512917986064953),
+                                    ("hh:mmhh:mm", -1.1526795099383855),
+                                    ("hourhour", -2.2512917986064953)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.3437347467010947),
+                                    ("minuteminute", -1.749199854809259),
+                                    ("minutehour", -1.3437347467010947),
+                                    ("hh:mmintersect", -1.749199854809259)],
+                               n = 8}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        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}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.7308875085427924,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.8870696490323797),
+                                    ("time-of-day (latent)", -1.2992829841302609),
+                                    ("until <time-of-day>", -2.803360380906535),
+                                    ("hour", -0.8574502318512216)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6567795363890705, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> quarter", -2.8622008809294686),
+                                    ("time-of-day (latent)", -0.9903987040278769),
+                                    ("hour", -0.916290731874155), ("minute", -2.8622008809294686),
+                                    ("after <time-of-day>", -2.8622008809294686)],
+                               n = 14}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("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}}),
+       ("July",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8690378470236094, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -0.5436154465889815, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.2992829841302609),
+                                    ("ordinals (first..19th)quarter (grain)", -1.2992829841302609),
+                                    ("quarter", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
+                                    ("ordinals (first..19th)quarter (grain)", -1.252762968495368),
+                                    ("quarter", -0.8472978603872037)],
+                               n = 2}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.5019253742957266,
+                               unseen = -6.0844994130751715,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("u <named-day><day-of-month>(ordinal) <named-month>",
+                                     -5.389071729816501),
+                                    ("hourday", -4.983606621708336),
+                                    ("dd.mm<time-of-day> o'clock", -5.389071729816501),
+                                    ("dayhour", -2.714923080389972),
+                                    ("daymonth", -3.597312260588446),
+                                    ("u <named-day><named-month> <day-of-month> (ordinal)",
+                                     -5.389071729816501),
+                                    ("monthyear", -3.6843236375780757),
+                                    ("Wednesdayintersect", -5.389071729816501),
+                                    ("christmasyear", -5.389071729816501),
+                                    ("Wednesdaynext <cycle>", -5.389071729816501),
+                                    ("u <named-day><time-of-day> o'clock", -5.389071729816501),
+                                    ("<time> <part-of-day>u <named-day>", -4.00277736869661),
+                                    ("intersectat <time-of-day>", -5.389071729816501),
+                                    ("Saturday<time> <part-of-day>", -4.983606621708336),
+                                    ("day before yesterdayat <time-of-day>", -4.695924549256556),
+                                    ("Marchyear", -5.389071729816501),
+                                    ("<named-day> <day-of-month> (ordinal)September",
+                                     -4.983606621708336),
+                                    ("Saturdayat <time-of-day>", -4.983606621708336),
+                                    ("between <time-of-day> and <time-of-day> (interval)u <named-day>",
+                                     -4.695924549256556),
+                                    ("between <datetime> and <datetime> (interval)u <named-day>",
+                                     -4.695924549256556),
+                                    ("last <cycle>u <named-day>", -5.389071729816501),
+                                    ("<time-of-day> o'clocktonight", -5.389071729816501),
+                                    ("from <datetime> - <datetime> (interval)u <named-day>",
+                                     -5.389071729816501),
+                                    ("today<time> <part-of-day>", -4.983606621708336),
+                                    ("todayat <time-of-day>", -5.389071729816501),
+                                    ("Thursday<time> timezone", -5.389071729816501),
+                                    ("from <time-of-day> - <time-of-day> (interval)u <named-day>",
+                                     -5.389071729816501),
+                                    ("next <cycle>u <named-day>", -5.389071729816501),
+                                    ("dayday", -3.1377799312100056),
+                                    ("hourhour", -5.389071729816501),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.983606621708336),
+                                    ("Thursdaybetween <time-of-day> and <time-of-day> (interval)",
+                                     -4.695924549256556),
+                                    ("dayyear", -3.884994333040227),
+                                    ("Thursdaybetween <datetime> and <datetime> (interval)",
+                                     -4.695924549256556),
+                                    ("<time-of-day> o'clocktomorrow", -5.389071729816501),
+                                    ("Thursday<time> <part-of-day>", -4.983606621708336),
+                                    ("<time-of-day> - <time-of-day> (interval)u <named-day>",
+                                     -4.472780997942346),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -4.983606621708336),
+                                    ("<datetime> - <datetime> (interval)u <named-day>",
+                                     -4.472780997942346),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
+                                     -4.00277736869661),
+                                    ("day after tomorrow<time> <part-of-day>", -5.389071729816501),
+                                    ("Thursdayhh:mm", -5.389071729816501),
+                                    ("minutemonth", -4.472780997942346),
+                                    ("day after tomorrowat <time-of-day>", -4.983606621708336),
+                                    ("absorption of , after named day<named-month> <day-of-month> (ordinal)",
+                                     -4.472780997942346),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.983606621708336),
+                                    ("<named-day> <day-of-month> (ordinal)February",
+                                     -4.136308761321133),
+                                    ("this <cycle>u <named-day>", -4.983606621708336),
+                                    ("last <day-of-week> <time>year", -4.983606621708336),
+                                    ("dd.mmat <time-of-day>", -4.983606621708336),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -4.472780997942346),
+                                    ("intersect<named-month> <day-of-month> (ordinal)",
+                                     -4.983606621708336),
+                                    ("Saturday<time-of-day> o'clock", -5.389071729816501),
+                                    ("day before yesterday<time-of-day> o'clock",
+                                     -5.389071729816501),
+                                    ("<time> <part-of-day><named-day> <day-of-month> (ordinal)",
+                                     -4.472780997942346),
+                                    ("dayminute", -3.3096301881366648),
+                                    ("u <named-day>at <time-of-day>", -4.983606621708336),
+                                    ("<time> <part-of-day>intersect", -3.5172695529149096),
+                                    ("u <named-day><time> <part-of-day>", -4.983606621708336),
+                                    ("Tuesdayu <named-month>", -5.389071729816501),
+                                    ("intersectyear", -5.389071729816501),
+                                    ("intersectSeptember", -4.472780997942346),
+                                    ("<ordinal> <cycle> of <time>year", -5.389071729816501),
+                                    ("minuteday", -2.093234863812172),
+                                    ("absorption of , after named dayintersect",
+                                     -5.389071729816501),
+                                    ("<time> <part-of-day>intersect by \",\"", -4.472780997942346),
+                                    ("Octoberyear", -4.290459441148391),
+                                    ("intersect by \",\"at <time-of-day>", -4.472780997942346),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -4.290459441148391),
+                                    ("yearat <time-of-day>", -5.389071729816501),
+                                    ("Septemberyear", -4.983606621708336),
+                                    ("<time> <part-of-day>absorption of , after named day",
+                                     -4.695924549256556),
+                                    ("todaytonight", -5.389071729816501),
+                                    ("weekday", -4.472780997942346),
+                                    ("dayweek", -5.389071729816501),
+                                    ("weekyear", -4.983606621708336),
+                                    ("Wednesdayu <named-month>", -5.389071729816501),
+                                    ("u <named-day><named-month> <day-of-month> (non ordinal)",
+                                     -5.389071729816501),
+                                    ("u <named-month>year", -4.983606621708336),
+                                    ("last <cycle> of <time>year", -4.983606621708336),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -5.389071729816501),
+                                    ("yearminute", -5.389071729816501)],
+                               n = 158},
+                   koData =
+                     ClassData{prior = -0.9297914190930576, unseen = -5.796057750765372,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("since <time-of-day>by <time>", -4.406719247264253),
+                                    ("year<time-of-day> - <time-of-day> (interval)",
+                                     -5.099866427824199),
+                                    ("hourday", -4.183575695950044),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.099866427824199),
+                                    ("dayhour", -3.228064250922607),
+                                    ("July<day-of-month> (non ordinal) <named-month>",
+                                     -5.099866427824199),
+                                    ("daymonth", -2.9598002643279275),
+                                    ("monthday", -3.713572066704308),
+                                    ("monthyear", -3.4904285153900982),
+                                    ("yearhour", -4.694401319716034),
+                                    ("Wednesdayintersect", -5.099866427824199),
+                                    ("hh:mmu <named-day>", -4.001254139156089),
+                                    ("last <time>today", -4.406719247264253),
+                                    ("intersectat <time-of-day>", -5.099866427824199),
+                                    ("Marchyear", -4.694401319716034),
+                                    ("u <named-day>September", -5.099866427824199),
+                                    ("<named-day> <day-of-month> (ordinal)September",
+                                     -5.099866427824199),
+                                    ("Thursdayafter <time-of-day>", -4.183575695950044),
+                                    ("until <time-of-day>u <named-day>", -5.099866427824199),
+                                    ("since <time-of-day>u <named-day>", -4.694401319716034),
+                                    ("Sundayu <named-month>", -5.099866427824199),
+                                    ("absorption of , after named dayJuly", -4.694401319716034),
+                                    ("JanuaryWednesday", -5.099866427824199),
+                                    ("Marchintersect", -5.099866427824199),
+                                    ("dayday", -4.001254139156089),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.099866427824199),
+                                    ("monthmonth", -4.183575695950044),
+                                    ("hourhour", -5.099866427824199),
+                                    ("<time> <part-of-day>Thursday", -5.099866427824199),
+                                    ("Thursdaybetween <time-of-day> and <time-of-day> (interval)",
+                                     -4.694401319716034),
+                                    ("dayyear", -4.406719247264253),
+                                    ("Thursdaybetween <datetime> and <datetime> (interval)",
+                                     -4.694401319716034),
+                                    ("Thursday<time> <part-of-day>", -4.694401319716034),
+                                    ("<time-of-day> - <time-of-day> (interval)u <named-day>",
+                                     -5.099866427824199),
+                                    ("FebruaryWednesday", -5.099866427824199),
+                                    ("monthminute", -5.099866427824199),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
+                                     -5.099866427824199),
+                                    ("minutemonth", -4.694401319716034),
+                                    ("MarchTuesday", -4.694401319716034),
+                                    ("absorption of , after named day<named-month> <day-of-month> (ordinal)",
+                                     -5.099866427824199),
+                                    ("intersect<time-of-day> - <time-of-day> (interval)",
+                                     -5.099866427824199),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.406719247264253),
+                                    ("intersect by \",\"<time-of-day> - <time-of-day> (interval)",
+                                     -4.183575695950044),
+                                    ("Aprilyear", -5.099866427824199),
+                                    ("Julynumeral to|till|before <integer> (hour-of-day)",
+                                     -5.099866427824199),
+                                    ("Thursdaysince <time-of-day>", -4.183575695950044),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.099866427824199),
+                                    ("August<day-of-month> (non ordinal) <named-month>",
+                                     -5.099866427824199),
+                                    ("dayminute", -3.0849634072819336),
+                                    ("<time> <part-of-day>intersect", -4.694401319716034),
+                                    ("Tuesdayu <named-month>", -5.099866427824199),
+                                    ("intersectyear", -4.183575695950044),
+                                    ("after <time-of-day>by <time>", -4.406719247264253),
+                                    ("intersectSeptember", -4.694401319716034),
+                                    ("minuteday", -3.0849634072819336),
+                                    ("absorption of , after named dayintersect",
+                                     -5.099866427824199),
+                                    ("<time> <part-of-day>intersect by \",\"", -5.099866427824199),
+                                    ("intersect by \",\"at <time-of-day>", -4.183575695950044),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -5.099866427824199),
+                                    ("yearat <time-of-day>", -5.099866427824199),
+                                    ("absorption of , after named daySeptember",
+                                     -4.694401319716034),
+                                    ("MarchMarch", -4.406719247264253),
+                                    ("after <time-of-day>u <named-day>", -4.694401319716034),
+                                    ("Wednesdayu <named-month>", -5.099866427824199),
+                                    ("absorption of , after named dayFebruary", -5.099866427824199),
+                                    ("hh:mmby <time>", -4.406719247264253),
+                                    ("u <named-month>year", -4.001254139156089),
+                                    ("minutesecond", -3.4904285153900982),
+                                    ("Tuesdayintersect", -5.099866427824199),
+                                    ("JanuaryTuesday", -5.099866427824199),
+                                    ("Sundayintersect", -5.099866427824199),
+                                    ("Mondayu <named-month>", -5.099866427824199)],
+                               n = 103}}),
+       ("early morning",
+        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> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7047480922384253),
+                                    ("ordinals (first..19th)week (grain)intersect",
+                                     -1.7047480922384253),
+                                    ("weekmonth", -1.2992829841302609),
+                                    ("ordinals (first..19th)day (grain)October",
+                                     -1.7047480922384253),
+                                    ("ordinals (first..19th)week (grain)October",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("season",
+        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}}),
+       ("year (grain)",
+        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}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.252762968495368),
+                                    ("hh:mmhh:mm", -1.252762968495368)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.5040773967762742),
+                                    ("minuteminute", -1.5040773967762742),
+                                    ("minutehour", -1.5040773967762742),
+                                    ("hh:mmintersect", -1.5040773967762742)],
+                               n = 2}}),
+       ("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}}),
+       ("day before 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}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.7047480922384253),
+                                    ("month (grain)", -1.9924301646902063),
+                                    ("year (grain)", -2.3978952727983707),
+                                    ("week (grain)", -1.7047480922384253),
+                                    ("quarter", -2.3978952727983707), ("year", -2.3978952727983707),
+                                    ("month", -1.9924301646902063),
+                                    ("quarter (grain)", -2.3978952727983707)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               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 = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("hh:mmhh:mm", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.0986122886681098),
+                                    ("minutehour", -1.0986122886681098)],
+                               n = 1}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
+                               n = 1}}),
+       ("yyyy-mm-dd",
+        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}}),
+       ("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}}),
+       ("prije <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003), ("day", -1.8971199848858813),
+                                    ("year", -2.3025850929940455),
+                                    ("<integer> <unit-of-duration>", -0.916290731874155),
+                                    ("month", -2.3025850929940455)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.3862943611198906),
+                                    ("hour", -1.3862943611198906)],
+                               n = 1}}),
+       ("evening|night",
+        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}}),
+       ("Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dd/mm/yyyy",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarteryear", -0.8472978603872037),
+                                    ("ordinals (first..19th)quarter (grain)year",
+                                     -1.252762968495368),
+                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after lunch",
+        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}}),
+       ("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}}),
+       ("numeral to|till|before <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (0..19)noon", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7731898882334817),
+                                    ("integer (numeric)time-of-day (latent)", -0.7731898882334817)],
+                               n = 5}}),
+       ("quarter to|till|before <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon", -0.6931471805599453), ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a pair",
+        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> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0296194171811581),
+                                    ("ordinals (first..19th)TuesdayOctober", -1.9459101490553135),
+                                    ("ordinals (first..19th)Wednesdayintersect",
+                                     -1.540445040947149),
+                                    ("ordinals (first..19th)Tuesdayintersect",
+                                     -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (first..19th)WednesdayOctober", -1.3862943611198906),
+                                    ("ordinals (first..19th)TuesdaySeptember", -1.791759469228055)],
+                               n = 3}}),
+       ("<hour-of-day> quarter",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1}}),
+       ("April",
+        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 (grain)",
+        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}}),
+       ("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}}),
+       ("last <day-of-week> <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9444616088408514),
+                                    ("Sundayu <named-month>", -2.1972245773362196),
+                                    ("SundayMarch", -2.1972245773362196),
+                                    ("MondayMarch", -2.1972245773362196),
+                                    ("Sundayintersect", -1.791759469228055),
+                                    ("Mondayu <named-month>", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("evening|night", -1.8718021769015913),
+                                    ("afternoon", -1.466337068793427),
+                                    ("hour", -0.9555114450274363),
+                                    ("morning", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.252762968495368),
+                                    ("late night", -1.252762968495368)],
+                               n = 1}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -4.652001563489282e-2,
+                               unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)September", -3.1986731175506815),
+                                    ("ordinal (digits)August", -2.793208009442517),
+                                    ("ordinals (first..19th)March", -2.2823823856765264),
+                                    ("ordinal (digits)February", -1.493925025312256),
+                                    ("ordinal (digits)April", -3.1986731175506815),
+                                    ("month", -0.8007778447523107),
+                                    ("ordinal (digits)March", -2.505525936990736)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -3.0910424533583156,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -1.5040773967762742),
+                                    ("month", -1.5040773967762742)],
+                               n = 1}}),
+       ("numbers i",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("integer (20..90)integer (0..19)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11}}),
+       ("Friday",
+        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}}),
+       ("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.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Friday", -1.3862943611198906), ("day", -1.3862943611198906),
+                                    ("March", -1.3862943611198906), ("month", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.5040773967762742),
+                                    ("midnight|EOD|end of day", -1.5040773967762742)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -2.740840023925201),
+                                    ("time-of-day (latent)", -1.488077055429833),
+                                    ("hh:mm", -2.0476928433652555), ("noon", -2.3353749158170367),
+                                    ("hour", -1.2367626271489267), ("minute", -1.824549292051046)],
+                               n = 12}}),
+       ("half an hour",
+        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}}),
+       ("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}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>", -0.8472978603872037),
+                                    ("minute", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8718021769015913),
+                                    ("month (grain)", -2.5649493574615367),
+                                    ("year (grain)", -2.5649493574615367),
+                                    ("week (grain)", -1.8718021769015913),
+                                    ("day", -2.5649493574615367), ("quarter", -2.159484249353372),
+                                    ("year", -2.5649493574615367), ("month", -2.5649493574615367),
+                                    ("quarter (grain)", -2.159484249353372),
+                                    ("day (grain)", -2.5649493574615367)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        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}}),
+       ("<hour-of-day> half",
+        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}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7047480922384253),
+                                    ("time-of-day (latent)", -1.0116009116784799),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.8109302162163288),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.898999234764094, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2231435513142097),
+                                    ("integer (0..19)", -2.0794415416798357)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -0.5225216635291818, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4700036292457356),
+                                    ("integer (20..90)", -2.9267394020670396),
+                                    ("few", -3.332204510175204),
+                                    ("integer (0..19)", -1.3862943611198906),
+                                    ("a pair", -3.332204510175204)],
+                               n = 51}}),
+       ("for <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.11441035117774422,
+                               unseen = -4.3694478524670215,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9704144655697013),
+                                    ("three-quarters of an hour", -2.7472709142554916),
+                                    ("number.number hours", -3.6635616461296463),
+                                    ("second", -3.6635616461296463), ("day", -2.5649493574615367),
+                                    ("half an hour", -2.5649493574615367),
+                                    ("year", -3.6635616461296463),
+                                    ("<integer> <unit-of-duration>", -1.221214610760442),
+                                    ("hour", -2.4107986776342782), ("month", -3.6635616461296463),
+                                    ("minute", -1.5234954826333758),
+                                    ("about <duration>", -3.6635616461296463)],
+                               n = 33},
+                   koData =
+                     ClassData{prior = -2.2246235515243336, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.3862943611198906),
+                                    ("hour", -1.3862943611198906)],
+                               n = 4}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -1.7047480922384253, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -4.5217885770490405,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5649493574615367),
+                                    ("integer (0..19)year (grain)", -3.1245651453969594),
+                                    ("integer (numeric)day (grain)", -2.431417964837014),
+                                    ("integer (0..19)hour (grain)", -3.817712325956905),
+                                    ("second", -3.817712325956905),
+                                    ("a pairhour (grain)", -3.817712325956905),
+                                    ("integer (numeric)year (grain)", -3.817712325956905),
+                                    ("day", -2.3136349291806306), ("year", -2.9014215940827497),
+                                    ("integer (numeric)week (grain)", -3.817712325956905),
+                                    ("integer (0..19)month (grain)", -3.41224721784874),
+                                    ("integer (0..19)second (grain)", -3.817712325956905),
+                                    ("hour", -2.5649493574615367), ("month", -3.41224721784874),
+                                    ("integer (numeric)minute (grain)", -2.7191000372887952),
+                                    ("integer (0..19)minute (grain)", -3.817712325956905),
+                                    ("fewhour (grain)", -3.817712325956905),
+                                    ("minute", -2.5649493574615367),
+                                    ("integer (numeric)hour (grain)", -3.1245651453969594),
+                                    ("integer (0..19)day (grain)", -3.817712325956905),
+                                    ("integer (0..19)week (grain)", -2.7191000372887952)],
+                               n = 33},
+                   koData =
+                     ClassData{prior = -0.4700036292457356, unseen = -4.912654885736052,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.959364629383116),
+                                    ("integer (0..19)year (grain)", -3.8066624897703196),
+                                    ("integer (numeric)day (grain)", -3.518980417318539),
+                                    ("fewday (grain)", -4.212127597878484),
+                                    ("integer (0..19)hour (grain)", -2.959364629383116),
+                                    ("second", -3.295836866004329),
+                                    ("numbers ihour (grain)", -3.8066624897703196),
+                                    ("integer (numeric)second (grain)", -3.8066624897703196),
+                                    ("integer (numeric)year (grain)", -3.8066624897703196),
+                                    ("day", -2.959364629383116), ("year", -3.295836866004329),
+                                    ("integer (numeric)week (grain)", -3.295836866004329),
+                                    ("integer (0..19)month (grain)", -3.8066624897703196),
+                                    ("integer (0..19)second (grain)", -3.8066624897703196),
+                                    ("hour", -1.5730702682632256), ("month", -3.295836866004329),
+                                    ("integer (numeric)minute (grain)", -3.8066624897703196),
+                                    ("integer (0..19)minute (grain)", -3.8066624897703196),
+                                    ("integer (numeric)month (grain)", -3.8066624897703196),
+                                    ("minute", -3.295836866004329),
+                                    ("integer (numeric)hour (grain)", -1.9095425048844386),
+                                    ("integer (0..19)day (grain)", -3.8066624897703196),
+                                    ("integer (0..19)week (grain)", -3.8066624897703196)],
+                               n = 55}}),
+       ("ordinals (first..19th)",
+        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}}),
+       ("<duration> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter of an hourtime-of-day (latent)", -2.0149030205422647),
+                                    ("minutehour", -1.6094379124341003),
+                                    ("<integer> <unit-of-duration>christmas", -2.0149030205422647),
+                                    ("quarter of an hour<time> <part-of-day>", -2.0149030205422647),
+                                    ("yearday", -2.0149030205422647),
+                                    ("minutesecond", -2.0149030205422647),
+                                    ("<integer> <unit-of-duration>now", -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -4.890349128221754,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("u <named-day><day-of-month>(ordinal) <named-month>",
+                                     -4.189654742026425),
+                                    ("<named-month> <day-of-month> (ordinal)intersect",
+                                     -4.189654742026425),
+                                    ("u <named-day><named-month> <day-of-month> (ordinal)",
+                                     -4.189654742026425),
+                                    ("intersecthh:mm", -4.189654742026425),
+                                    ("intersect by \",\"year", -3.784189633918261),
+                                    ("dayday", -2.1102132003465894),
+                                    ("intersect by \",\"hh:mm", -3.2733640101522705),
+                                    ("intersect by \",\"intersect by \",\"", -4.189654742026425),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.189654742026425),
+                                    ("dayyear", -2.803360380906535),
+                                    ("Wednesday<day-of-month>(ordinal) <named-month>",
+                                     -4.189654742026425),
+                                    ("<named-month> <day-of-month> (ordinal)intersect by \",\"",
+                                     -4.189654742026425),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -4.189654742026425),
+                                    ("Monday<day-of-month>(ordinal) <named-month>",
+                                     -3.4965075614664802),
+                                    ("intersect<day-of-month>(ordinal) <named-month>",
+                                     -3.784189633918261),
+                                    ("intersect<named-month> <day-of-month> (ordinal)",
+                                     -4.189654742026425),
+                                    ("Fridayintersect", -4.189654742026425),
+                                    ("intersect by \",\"intersect", -4.189654742026425),
+                                    ("intersectintersect by \",\"", -4.189654742026425),
+                                    ("dayminute", -2.1102132003465894),
+                                    ("intersectyear", -3.784189633918261),
+                                    ("minuteday", -3.2733640101522705),
+                                    ("Sunday<day-of-month>(ordinal) <named-month>",
+                                     -3.784189633918261),
+                                    ("yearhh:mm", -4.189654742026425),
+                                    ("Friday<named-month> <day-of-month> (ordinal)",
+                                     -3.784189633918261),
+                                    ("intersectintersect", -4.189654742026425),
+                                    ("Fridayintersect by \",\"", -3.0910424533583156),
+                                    ("u <named-day><named-month> <day-of-month> (non ordinal)",
+                                     -4.189654742026425),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.189654742026425),
+                                    ("<named-month> <day-of-month> (ordinal)year",
+                                     -3.784189633918261),
+                                    ("yearminute", -4.189654742026425),
+                                    ("Monday<named-month> <day-of-month> (ordinal)",
+                                     -4.189654742026425)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.2039728043259361, unseen = -4.442651256490317,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.7376696182833684),
+                                    ("<named-month> <day-of-month> (ordinal)intersect",
+                                     -3.7376696182833684),
+                                    ("dayhour", -2.639057329615259),
+                                    ("daymonth", -2.639057329615259),
+                                    ("monthyear", -3.7376696182833684),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.332204510175204),
+                                    ("u <named-day>September", -3.7376696182833684),
+                                    ("dayday", -2.639057329615259),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -3.7376696182833684),
+                                    ("FridayJuly", -3.332204510175204),
+                                    ("minutemonth", -3.7376696182833684),
+                                    ("at <time-of-day><day-of-month>(ordinal) <named-month>",
+                                     -3.7376696182833684),
+                                    ("Aprilyear", -3.7376696182833684),
+                                    ("MondayFebruary", -3.7376696182833684),
+                                    ("Saturday<named-month> <day-of-month> (ordinal)",
+                                     -3.7376696182833684),
+                                    ("Fridayintersect", -3.7376696182833684),
+                                    ("intersect by \",\"intersect", -3.7376696182833684),
+                                    ("SaturdaySeptember", -3.7376696182833684),
+                                    ("intersectSeptember", -3.7376696182833684),
+                                    ("intersectintersect", -3.7376696182833684),
+                                    ("Friday<day-of-month>(ordinal) <named-month>",
+                                     -3.7376696182833684),
+                                    ("Fridayintersect by \",\"", -3.7376696182833684)],
+                               n = 18}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -2.7398974188114388e-2,
+                               unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   koData =
+                     ClassData{prior = -3.6109179126442243,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("second (grain)",
+        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}}),
+       ("u <named-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.845826690498331),
+                                    ("absorption of , after named day", -2.538973871058276),
+                                    ("Wednesday", -2.538973871058276),
+                                    ("Saturday", -2.2512917986064953),
+                                    ("Monday", -2.9444389791664407),
+                                    ("Friday", -2.9444389791664407), ("day", -0.8649974374866046),
+                                    ("Sunday", -2.9444389791664407)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("absorption of , after named dayordinal (digits)",
+                                     -1.0116009116784799),
+                                    ("day", -0.7884573603642702),
+                                    ("Tuesdayordinal (digits)", -2.3978952727983707),
+                                    ("u <named-day>ordinal (digits)", -2.3978952727983707)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("absorption of , after named dayordinal (digits)",
+                                     -1.0986122886681098),
+                                    ("day", -1.0986122886681098)],
+                               n = 1}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.7047480922384253, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("evening|night", -2.0794415416798357),
+                                    ("day", -1.6739764335716716), ("Sunday", -2.0794415416798357),
+                                    ("hour", -1.6739764335716716), ("Tuesday", -2.0794415416798357),
+                                    ("week-end", -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> o'clock", -3.0910424533583156),
+                                    ("time-of-day (latent)", -0.8938178760220964),
+                                    ("hour", -0.8397506547518206)],
+                               n = 18}}),
+       ("March",
+        Classifier{okData =
+                     ClassData{prior = -0.4795730802618862, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -0.9650808960435872,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("since <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -2.772588722239781, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm", -1.7047480922384253),
+                                    ("minute", -1.7047480922384253)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.9704144655697013),
+                                    ("intersect", -1.8718021769015913),
+                                    ("second", -2.0541237336955462),
+                                    ("numeral to|till|before <integer> (hour-of-day)",
+                                     -2.9704144655697013),
+                                    ("now", -2.9704144655697013), ("hh:mm", -2.277267285009756),
+                                    ("<datetime> - <datetime> (interval)", -2.5649493574615367),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.5649493574615367),
+                                    ("minute", -1.1786549963416462)],
+                               n = 15}}),
+       ("noon",
+        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}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.2039728043259361, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> o'clock", -1.8718021769015913),
+                                    ("time-of-day (latent)", -1.466337068793427),
+                                    ("hour", -1.1786549963416462)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -2.3513752571634776),
+                                    ("hh:mm", -1.6582280766035324), ("noon", -1.9459101490553135),
+                                    ("hour", -1.4350845252893227),
+                                    ("midnight|EOD|end of day", -2.3513752571634776),
+                                    ("minute", -1.6582280766035324)],
+                               n = 7}}),
+       ("<integer> and an half hours",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (0..19)", 0.0)],
+                               n = 1}}),
+       ("after <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("late night",
+        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}}),
+       ("midnight|EOD|end of 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 <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.4423470353692043),
+                                    ("Monday", -2.4423470353692043),
+                                    ("Friday", -2.4423470353692043), ("day", -1.1895840668738362),
+                                    ("March", -2.4423470353692043), ("month", -2.4423470353692043),
+                                    ("Tuesday", -1.749199854809259)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.5040773967762742, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> o'clock", -1.466337068793427),
+                                    ("hour", -1.466337068793427)],
+                               n = 2}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -2.3025850929940455),
+                                    ("year (grain)", -1.8971199848858813),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -1.8971199848858813), ("month", -2.3025850929940455)],
+                               n = 7},
+                   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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6026896854443837),
+                                    ("integer (0..19)year (grain)", -3.295836866004329),
+                                    ("integer (numeric)day (grain)", -3.295836866004329),
+                                    ("fewday (grain)", -3.295836866004329),
+                                    ("integer (0..19)hour (grain)", -3.295836866004329),
+                                    ("second", -2.890371757896165),
+                                    ("integer (numeric)second (grain)", -3.295836866004329),
+                                    ("integer (numeric)year (grain)", -3.295836866004329),
+                                    ("day", -2.6026896854443837), ("year", -2.890371757896165),
+                                    ("integer (numeric)week (grain)", -2.890371757896165),
+                                    ("integer (0..19)month (grain)", -3.295836866004329),
+                                    ("integer (0..19)second (grain)", -3.295836866004329),
+                                    ("hour", -2.890371757896165), ("month", -2.890371757896165),
+                                    ("integer (numeric)minute (grain)", -3.295836866004329),
+                                    ("integer (0..19)minute (grain)", -3.295836866004329),
+                                    ("integer (numeric)month (grain)", -3.295836866004329),
+                                    ("minute", -2.890371757896165),
+                                    ("integer (numeric)hour (grain)", -3.295836866004329),
+                                    ("integer (0..19)day (grain)", -3.295836866004329),
+                                    ("integer (0..19)week (grain)", -3.295836866004329)],
+                               n = 16},
+                   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 = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("today", -2.0794415416798357),
+                                    ("next <cycle>", -2.0794415416798357),
+                                    ("day", -1.3862943611198906),
+                                    ("this <cycle>", -1.6739764335716716),
+                                    ("month", -1.6739764335716716),
+                                    ("this <time>", -2.0794415416798357)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.343805421853684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9444389791664407),
+                                    ("three-quarters of an hour", -2.7212954278522306),
+                                    ("number.number hours", -3.6375861597263857),
+                                    ("second", -3.6375861597263857), ("day", -2.538973871058276),
+                                    ("half an hour", -2.538973871058276),
+                                    ("year", -3.6375861597263857),
+                                    ("<integer> <unit-of-duration>", -1.2396908869280152),
+                                    ("hour", -2.384823191231018), ("month", -3.6375861597263857),
+                                    ("minute", -1.55814461804655),
+                                    ("about <duration>", -3.6375861597263857)],
+                               n = 32},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("since <time-of-day>hh:mm", -2.639057329615259),
+                                    ("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.7227665977411035),
+                                    ("dayday", -2.2335922215070942),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -2.2335922215070942),
+                                    ("after <time-of-day>hh:mm", -2.639057329615259)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -2.4849066497880004),
+                                    ("daymonth", -2.0794415416798357),
+                                    ("minuteminute", -1.5686159179138452),
+                                    ("after <time-of-day>intersect", -2.4849066497880004),
+                                    ("hh:mmintersect", -2.0794415416798357),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -2.4849066497880004),
+                                    ("since <time-of-day>intersect", -2.4849066497880004)],
+                               n = 6}}),
+       ("Tuesday",
+        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}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("since <time-of-day>hh:mm", -2.4423470353692043),
+                                    ("minuteminute", -1.1895840668738362),
+                                    ("hh:mmhh:mm", -1.5260563034950494),
+                                    ("after <time-of-day>hh:mm", -2.4423470353692043)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("since <time-of-day>time-of-day (latent)", -2.740840023925201),
+                                    ("hh:mmtime-of-day (latent)", -1.824549292051046),
+                                    ("hourhour", -2.740840023925201),
+                                    ("minutehour", -1.1314021114911006),
+                                    ("numeral to|till|before <integer> (hour-of-day)time-of-day (latent)",
+                                     -2.0476928433652555),
+                                    ("at <time-of-day>time-of-day (latent)", -2.740840023925201),
+                                    ("after <time-of-day>time-of-day (latent)",
+                                     -2.740840023925201)],
+                               n = 10}}),
+       ("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}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.70805020110221),
+                                    ("integer (0..19)year (grain)", -3.4011973816621555),
+                                    ("integer (numeric)day (grain)", -2.995732273553991),
+                                    ("integer (0..19)hour (grain)", -3.4011973816621555),
+                                    ("second", -2.995732273553991),
+                                    ("numbers ihour (grain)", -2.995732273553991),
+                                    ("integer (numeric)second (grain)", -3.4011973816621555),
+                                    ("integer (numeric)year (grain)", -3.4011973816621555),
+                                    ("day", -2.70805020110221), ("year", -2.995732273553991),
+                                    ("integer (numeric)week (grain)", -2.995732273553991),
+                                    ("integer (0..19)month (grain)", -3.4011973816621555),
+                                    ("integer (0..19)second (grain)", -3.4011973816621555),
+                                    ("hour", -2.3025850929940455), ("month", -2.995732273553991),
+                                    ("integer (numeric)minute (grain)", -3.4011973816621555),
+                                    ("integer (0..19)minute (grain)", -3.4011973816621555),
+                                    ("integer (numeric)month (grain)", -3.4011973816621555),
+                                    ("minute", -2.995732273553991),
+                                    ("integer (numeric)hour (grain)", -2.995732273553991),
+                                    ("integer (0..19)day (grain)", -3.4011973816621555),
+                                    ("integer (0..19)week (grain)", -3.4011973816621555)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
+                               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..19th)Tuesdayintersect", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)Tuesdaychristmas", -0.916290731874155),
+                                    ("dayday", -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.6061358035703156,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -1.791759469228055),
+                                    ("month", -0.9444616088408514),
+                                    ("Februaryinteger (numeric)", -2.1972245773362196),
+                                    ("Septemberinteger (numeric)", -2.1972245773362196),
+                                    ("Julyinteger (numeric)", -1.791759469228055)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Aprilinteger (numeric)", -2.0794415416798357),
+                                    ("month", -0.9808292530117262),
+                                    ("Julyinteger (numeric)", -1.1631508098056809)],
+                               n = 5}}),
+       ("numeral after|past (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("integer (20..90)time-of-day (latent)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)April", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)August", -1.3862943611198906),
+                                    ("month", -0.9808292530117262),
+                                    ("integer (numeric)July", -1.3862943611198906)],
+                               n = 2}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.03688192726104), ("Monday", -2.03688192726104),
+                                    ("Friday", -2.4423470353692043), ("day", -0.832909122935104),
+                                    ("Tuesday", -1.5260563034950494)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -3.7740327982847086e-2,
+                               unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
+                   koData =
+                     ClassData{prior = -3.295836866004329, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter (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}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.9459101490553135),
+                                    ("daymonth", -1.540445040947149),
+                                    ("day (grain)intersect", -1.9459101490553135),
+                                    ("weekmonth", -1.540445040947149),
+                                    ("week (grain)intersect", -1.9459101490553135),
+                                    ("week (grain)September", -1.9459101490553135)],
+                               n = 4},
+                   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 = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..19th)March", -1.6094379124341003),
+                                    ("ordinal (digits)April", -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)March", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("half <integer> (HR style 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}}),
+       ("week-end",
+        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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -2.890371757896165, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm", -1.9459101490553135),
+                                    ("minute", -1.9459101490553135)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -5.715841383994864e-2,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -3.1354942159291497),
+                                    ("<time-of-day> o'clock", -3.1354942159291497),
+                                    ("intersect", -2.03688192726104),
+                                    ("second", -2.2192034840549946),
+                                    ("numeral to|till|before <integer> (hour-of-day)",
+                                     -3.1354942159291497),
+                                    ("now", -3.1354942159291497),
+                                    ("time-of-day (latent)", -3.1354942159291497),
+                                    ("hh:mm", -2.4423470353692043), ("hour", -2.7300291078209855),
+                                    ("<datetime> - <datetime> (interval)", -2.7300291078209855),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.7300291078209855),
+                                    ("minute", -1.3437347467010947)],
+                               n = 17}}),
+       ("day (grain)",
+        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}}),
+       ("dd.mm",
+        Classifier{okData =
+                     ClassData{prior = -1.8718021769015913,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.1670540846631662,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
+       ("day after tomorrow",
+        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}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -1.6094379124341003),
+                                    ("quarter of an hour", -1.0986122886681098),
+                                    ("minute", -0.7621400520468967)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter of an hour", -0.7884573603642702),
+                                    ("minute", -0.7884573603642702)],
+                               n = 4}}),
+       ("u <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.540445040947149), ("March", -1.252762968495368),
+                                    ("month", -0.8472978603872037)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6061358035703156, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("September", -1.6739764335716716),
+                                    ("October", -1.1631508098056809),
+                                    ("month", -0.8266785731844679)],
+                               n = 6}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.1670540846631662,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("today", -2.833213344056216),
+                                    ("Wednesday", -2.833213344056216),
+                                    ("season", -2.1400661634962708),
+                                    ("evening|night", -2.833213344056216),
+                                    ("Monday", -2.833213344056216), ("day", -1.580450375560848),
+                                    ("afternoon", -2.833213344056216),
+                                    ("hour", -1.7346010553881064), ("morning", -2.833213344056216),
+                                    ("week-end", -2.4277482359480516)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.8718021769015913, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.0794415416798357), ("hour", -2.0794415416798357),
+                                    ("late night", -2.0794415416798357),
+                                    ("Tuesday", -2.0794415416798357)],
+                               n = 2}}),
+       ("<named-month> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyordinal (digits)", -1.3862943611198906),
+                                    ("Septemberordinal (digits)", -1.791759469228055),
+                                    ("Februaryordinal (digits)", -1.791759469228055),
+                                    ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August",
+        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}})]
diff --git a/Duckling/Ranking/Classifiers/HU_XX.hs b/Duckling/Ranking/Classifiers/HU_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/HU_XX.hs
@@ -0,0 +1,318 @@
+-- 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.HU_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("Thursday",
+        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 (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -1.2205021062771466, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -0.3496737484797488,
+                               unseen = -3.8066624897703196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 43}}),
+       ("pm <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.9985288301111273),
+                                    ("todaypart of days", -1.3350010667323402),
+                                    ("tomorrowpart of days", -2.2512917986064953),
+                                    ("yesterdaypart of days", -2.2512917986064953)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.0986122886681098),
+                                    ("next <day-of-week>part of days", -2.0149030205422647),
+                                    ("yyyy.mm.ddpart of days", -2.0149030205422647),
+                                    ("Wednesdaypart of days", -1.6094379124341003)],
+                               n = 4}}),
+       ("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}}),
+       ("month (grain)",
+        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}}),
+       ("January",
+        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}}),
+       ("Wednesday",
+        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}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.0498221244986778),
+                                    ("yyyy.mm.ddhh:mm", -2.995732273553991),
+                                    ("Wednesdaypm <time-of-day>", -2.3025850929940455),
+                                    ("todaypart of days", -2.0794415416798357),
+                                    ("yyyy.mm.ddpm <time-of-day>", -2.995732273553991),
+                                    ("dayminute", -2.995732273553991),
+                                    ("tomorrowpart of days", -2.995732273553991),
+                                    ("next <day-of-week>pm <time-of-day>", -2.3025850929940455),
+                                    ("yesterdaypart of days", -2.995732273553991)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1786549963416462),
+                                    ("next <day-of-week>part of days", -2.5649493574615367),
+                                    ("Wednesdaypm <time-of-day>", -1.8718021769015913),
+                                    ("yyyy.mm.ddpart of days", -2.5649493574615367),
+                                    ("Wednesdaypart of days", -2.159484249353372)],
+                               n = 7}}),
+       ("year (grain)",
+        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 before yesterday",
+        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}}),
+       ("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}}),
+       ("yesterday",
+        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:ss",
+        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}}),
+       ("am <time-of-day>",
+        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}}),
+       ("end of month",
+        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}}),
+       ("tomorrow",
+        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 = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month (grain)", -1.3862943611198906),
+                                    ("year (grain)", -1.3862943611198906),
+                                    ("year", -1.3862943611198906), ("month", -1.3862943611198906)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.7047480922384253),
+                                    ("Wednesday", -1.0116009116784799),
+                                    ("day", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sunday",
+        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}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("March",
+        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}}),
+       ("yyyy.mm.dd",
+        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}}),
+       ("number (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("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}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marchinteger (numeric)", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("seasons",
+        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}}),
+       ("mm.dd",
+        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}}),
+       ("right now",
+        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}}),
+       ("end of 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}}),
+       ("day after tomorrow",
+        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}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}})]
diff --git a/Duckling/Ranking/Classifiers/ID.hs b/Duckling/Ranking/Classifiers/ID.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/ID.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.ID (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/ID_XX.hs b/Duckling/Ranking/Classifiers/ID_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ID_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.ID_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/IT.hs b/Duckling/Ranking/Classifiers/IT.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/IT.hs
+++ /dev/null
@@ -1,2085 +0,0 @@
--- 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.IT (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time-of-day> - <time-of-day> <day-of-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhourday", -1.6094379124341003),
-                                    ("minuteminuteday", -1.6094379124341003),
-                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)named-day",
-                                     -1.6094379124341003),
-                                    ("<integer> (latent time-of-day)<integer> (latent time-of-day)named-day",
-                                     -1.6094379124341003)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)<integer> (latent time-of-day)named-month",
-                                     -1.3862943611198906),
-                                    ("hourhourmonth", -1.3862943611198906)],
-                               n = 1}}),
-       ("midnight",
-        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}}),
-       ("the <cycle> next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("semaine (grain)", -1.3862943611198906),
-                                    ("mois (grain)", -1.3862943611198906),
-                                    ("month", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.0986122886681098),
-                                    ("hh(:|h)mm (time-of-day)", -1.791759469228055),
-                                    ("hour", -1.3862943611198906), ("minute", -1.3862943611198906)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.5510646669461725, unseen = -5.030437921392435,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 151},
-                   koData =
-                     ClassData{prior = -0.8588143024487628, unseen = -4.727387818712341,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 111}}),
-       ("the day before yesterday",
-        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}}),
-       ("lunch",
-        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[/-]mm",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("today",
-        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}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.6325225587435105,
-                               unseen = -4.7535901911063645,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midnight", -4.051784947803305),
-                                    ("<time> timezone", -4.051784947803305),
-                                    ("<integer 0 12> del <part of day>", -2.665490586683414),
-                                    ("<integer> (latent time-of-day)", -1.5668782980153044),
-                                    ("hh(:|h)mm (time-of-day)", -2.1058747987479913),
-                                    ("<hour-of-day> and <relative minutes>", -4.051784947803305),
-                                    ("noon", -3.6463198396951406),
-                                    ("hh <relative-minutes> del pomeriggio(time-of-day)",
-                                     -3.6463198396951406),
-                                    ("<hour-of-day> minus quart", -4.051784947803305),
-                                    ("hour", -1.2185716037470886), ("minute", -1.8004931491968097)],
-                               n = 51},
-                   koData =
-                     ClassData{prior = -0.7576857016975165,
-                               unseen = -4.6443908991413725,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("una", -3.9415818076696905),
-                                    ("<integer> (latent time-of-day)", -1.0512100497735257),
-                                    ("hh(:|h)mm (time-of-day)", -2.842969519001581),
-                                    ("<hour-of-day> and <relative minutes>", -3.536116699561526),
-                                    ("<hour-of-day> minus <integer> (as relative minutes)",
-                                     -3.9415818076696905),
-                                    ("noon", -3.9415818076696905), ("hour", -0.99714282850325),
-                                    ("minute", -2.4375044108934163)],
-                               n = 45}}),
-       ("ann\233e (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}}),
-       ("dopo le <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midnight", -2.0149030205422647),
-                                    ("<integer> (latent time-of-day)", -1.0986122886681098),
-                                    ("hour", -0.916290731874155)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.2876820724517809, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midnight", -2.8622008809294686),
-                                    ("<integer> (latent time-of-day)", -1.0704414117014134),
-                                    ("hh(:|h)mm (time-of-day)", -2.169053700369523),
-                                    ("hour", -0.9903987040278769), ("minute", -2.169053700369523)],
-                               n = 15}}),
-       ("seconde (grain)",
-        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}}),
-       ("stanotte",
-        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}}),
-       ("dal <integer> al <integer> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..19)number (0..19)", -0.6931471805599453),
-                                    ("integer (numeric)integer (numeric)", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer 0 12> del <part of day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2876820724517809),
-                                    ("number (0..19)", -1.3862943611198906)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("una",
-        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}}),
-       ("semaine (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("il <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("mois (grain)",
-        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}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 3}}),
-       ("in|entro <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>", -0.8472978603872037),
-                                    ("minute", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2039728043259361),
-                                    ("semaine (grain)", -1.2039728043259361),
-                                    ("mois (grain)", -1.6094379124341003),
-                                    ("month", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("epifania",
-        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}}),
-       ("last <time> ",
-        Classifier{okData =
-                     ClassData{prior = -2.8622008809294686,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.7047480922384253),
-                                    ("named-day", -1.7047480922384253),
-                                    ("hour", -1.7047480922384253),
-                                    ("week-end", -1.7047480922384253)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -5.8840500022933465e-2,
-                               unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.9582549309731873),
-                                    ("intersect by \"di\", \"della\", \"del\"",
-                                     -3.1918471524802814),
-                                    ("day", -2.344549292093078), ("named-day", -3.1918471524802814),
-                                    ("hour", -0.9582549309731873),
-                                    ("two time tokens separated by `di`", -3.1918471524802814)],
-                               n = 33}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7047480922384253),
-                                    ("weekmonth", -1.2992829841302609),
-                                    ("ordinals (primo..10)jour (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("ordinals (primo..10)semaine (grain)named-month",
-                                     -1.7047480922384253),
-                                    ("ordinals (primo..10)semaine (grain)two time tokens in a row",
-                                     -1.7047480922384253)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("season",
-        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}}),
-       ("<time> last",
-        Classifier{okData =
-                     ClassData{prior = -1.791759469228055, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.252762968495368), ("named-day", -1.252762968495368)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.1823215567939546, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.6094379124341003),
-                                    ("<integer> (latent time-of-day)", -1.3217558399823195),
-                                    ("hour", -0.916290731874155)],
-                               n = 5}}),
-       ("the <ordinal> <cycle> <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinals (primo..10)trimestre (grain)year (1000-2100 not latent)",
-                                     -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("verso <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("evening", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("weekday", -0.9808292530117262),
-                                    ("semaine (grain)<day-of-month> <named-month>",
-                                     -0.9808292530117262)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("semaine (grain)<integer> (latent time-of-day)",
-                                     -0.9808292530117262),
-                                    ("weekhour", -0.9808292530117262)],
-                               n = 2}}),
-       ("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}}),
-       ("in the <part-of-day> of <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -0.9808292530117262),
-                                    ("morningnamed-day", -1.3862943611198906),
-                                    ("eveningtomorrow", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -0.9808292530117262),
-                                    ("nighttomorrow", -0.9808292530117262)],
-                               n = 2}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinals (primo..10)trimestre (grain)year (1000-2100 not latent)",
-                                     -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("festa della repubblica",
-        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/after <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4849066497880004),
-                                    ("un quarto d'ora", -2.4849066497880004),
-                                    ("<integer> <unit-of-duration>", -1.5686159179138452),
-                                    ("une <unit-of-duration>", -2.4849066497880004),
-                                    ("hour", -2.0794415416798357),
-                                    ("mezz'ora", -2.4849066497880004),
-                                    ("minute", -1.3862943611198906),
-                                    ("tre quarti d'ora", -2.4849066497880004)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("i|le n <cycle> passati|passate",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.219507705176107,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)heure (grain)",
-                                     -3.5115454388310208),
-                                    ("number (0..19)heure (grain)", -3.5115454388310208),
-                                    ("number (0..19)jour (grain)", -2.8183982582710754),
-                                    ("second", -3.1060803307228566),
-                                    ("integer (numeric)ann\233e (grain)", -3.1060803307228566),
-                                    ("integer (numeric)seconde (grain)", -3.5115454388310208),
-                                    ("integer (numeric)jour (grain)", -3.1060803307228566),
-                                    ("day", -2.412933150162911), ("year", -2.5952547069568657),
-                                    ("number (0..19)seconde (grain)", -3.5115454388310208),
-                                    ("number (0..19)ann\233e (grain)", -3.1060803307228566),
-                                    ("hour", -2.2587824703356527),
-                                    ("number (0..19)mois (grain)", -3.1060803307228566),
-                                    ("month", -2.412933150162911),
-                                    ("integer (numeric)minute (grain)", -3.5115454388310208),
-                                    ("integer (numeric)mois (grain)", -2.8183982582710754),
-                                    ("minute", -3.1060803307228566),
-                                    ("number (0..19)minute (grain)", -3.5115454388310208),
-                                    ("integer (numeric)heure (grain)", -2.5952547069568657)],
-                               n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("un quarto d'ora",
-        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}}),
-       ("santo stefano",
-        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}}),
-       ("entro il <integer>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("stasera",
-        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> (latent time-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("number (0..19)", -1.3862943611198906)],
-                               n = 41},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -4.454347296253507,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3317773923170052),
-                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-                                     -3.3440389678222067),
-                                    ("number (0..19)", -1.3981288187668934)],
-                               n = 82}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7731898882334817),
-                                    ("ordinals (primo..10)named-daynamed-month",
-                                     -1.466337068793427),
-                                    ("ordinals (primo..10)named-daytwo time tokens in a row",
-                                     -1.1786549963416462)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.8109302162163288),
-                                    ("ordinals (primo..10)named-daynamed-month",
-                                     -0.8109302162163288)],
-                               n = 3}}),
-       ("a quart to <integer> (as hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon", -0.6931471805599453), ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> notte",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("new year's eve", -1.8718021769015913),
-                                    ("tomorrow", -0.9555114450274363),
-                                    ("day", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = -1.680711831638129e-2,
-                               unseen = -4.110873864173311,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 59},
-                   koData =
-                     ClassData{prior = -4.0943445622221, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("intersect by \"di\", \"della\", \"del\"",
-        Classifier{okData =
-                     ClassData{prior = -0.41616039722491244,
-                               unseen = -4.442651256490317,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)named-day", -3.332204510175204),
-                                    ("named-daynamed-month", -3.332204510175204),
-                                    ("hourday", -2.4849066497880004),
-                                    ("day of month (1st)named-month", -3.7376696182833684),
-                                    ("daymonth", -2.3513752571634776),
-                                    ("named-daytwo time tokens in a row", -3.7376696182833684),
-                                    ("at <time-of-day>named-day", -3.332204510175204),
-                                    ("hh(:|h)mm (time-of-day)<day-of-month> <named-month>",
-                                     -3.7376696182833684),
-                                    ("two time tokens in a rowtwo time tokens in a row",
-                                     -3.7376696182833684),
-                                    ("dalle <time-of-day> alle <time-of-day> (interval)named-day",
-                                     -3.044522437723423),
-                                    ("<integer 0 12> del <part of day>tomorrow",
-                                     -3.7376696182833684),
-                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
-                                     -2.8213788864092133),
-                                    ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
-                                     -3.332204510175204),
-                                    ("at <time-of-day>two time tokens in a row",
-                                     -3.332204510175204),
-                                    ("minuteday", -1.6582280766035324),
-                                    ("at <time-of-day><named-day> <day-of-month>",
-                                     -3.7376696182833684),
-                                    ("dayweek", -3.044522437723423),
-                                    ("two time tokens in a rownamed-month", -3.332204510175204),
-                                    ("<dim time> al <part-of-day>tomorrow", -3.7376696182833684),
-                                    ("named-daythis <cycle>", -3.044522437723423),
-                                    ("tra il <datetime> e il <datetime> (interval)named-day",
-                                     -3.332204510175204)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -1.0775588794702773, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)named-day", -2.890371757896165),
-                                    ("named-daynamed-month", -2.379546134130174),
-                                    ("hourday", -2.1972245773362196),
-                                    ("daymonth", -1.9095425048844386),
-                                    ("named-daytwo time tokens in a row", -2.6026896854443837),
-                                    ("at <time-of-day>named-day", -2.1972245773362196),
-                                    ("stanottetomorrow", -2.890371757896165),
-                                    ("minuteday", -2.379546134130174)],
-                               n = 16}}),
-       ("<hour-of-day> and a quart",
-        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> (latent time-of-day)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2}}),
-       ("commemorazione dei defunti",
-        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}}),
-       ("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}}),
-       ("hh(:|h)mm (time-of-day)",
-        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}}),
-       ("EOY|End of 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}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.4595323293784402, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("afternoon", -2.639057329615259),
-                                    ("hour", -0.7672551527136672), ("evening", -1.1349799328389845),
-                                    ("morning", -1.9459101490553135)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.9985288301111273,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8109302162163288), ("evening", -1.791759469228055),
-                                    ("morning", -1.0986122886681098)],
-                               n = 7}}),
-       ("circa per le <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer 0 12> del <part of day>", -1.5040773967762742),
-                                    ("<integer> (latent time-of-day)", -1.0986122886681098),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("christmas eve",
-        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}}),
-       ("festa del lavoro",
-        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}}),
-       ("il week-end del <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("<day-of-month> <named-month>", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2231435513142097),
-                                    ("number (0..19)", -1.6094379124341003)],
-                               n = 13}}),
-       ("entro le <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("il <day-of-month>", -2.639057329615259),
-                                    ("<integer> (latent time-of-day)", -2.2335922215070942),
-                                    ("named-month", -2.639057329615259),
-                                    ("hh(:|h)mm (time-of-day)", -2.639057329615259),
-                                    ("EOY|End of year", -2.639057329615259),
-                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
-                                    ("EOM|End of month", -2.639057329615259),
-                                    ("noon", -2.639057329615259), ("hour", -1.9459101490553135),
-                                    ("month", -2.2335922215070942), ("minute", -2.639057329615259)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -2.1972245773362196, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.9459101490553135),
-                                    ("hour", -1.9459101490553135)],
-                               n = 1}}),
-       ("new year's eve",
-        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}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = -5.406722127027582e-2,
-                               unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
-                   koData =
-                     ClassData{prior = -2.9444389791664407,
-                               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}}),
-       ("domattina",
-        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.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (primo..10)",
-        Classifier{okData =
-                     ClassData{prior = -1.0185695809945732, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -0.4480247225269604,
-                               unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.6931471805599453),
-                                    ("ordinals (primo..10)jour (grain)named-month",
-                                     -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("gli <n> ultimi <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.8109302162163288),
-                                    ("number (0..19)semaine (grain)", -1.5040773967762742),
-                                    ("integer (numeric)semaine (grain)", -1.0986122886681098)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("afternoon",
-        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}}),
-       ("tra il <integer> e il <integer> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2809338454620642),
-                                    ("ann\233e (grain)", -2.1972245773362196),
-                                    ("semaine (grain)", -1.2809338454620642),
-                                    ("quarter", -2.1972245773362196), ("year", -2.1972245773362196),
-                                    ("trimestre (grain)", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("semaine (grain)", -1.3862943611198906)],
-                               n = 1}}),
-       ("minute (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}}),
-       ("il <cycle> dopo <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.5040773967762742),
-                                    ("dayday", -1.5040773967762742),
-                                    ("mois (grain)two time tokens in a row", -1.5040773967762742),
-                                    ("jour (grain)tomorrow", -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.252762968495368),
-                                    ("mois (grain)christmas", -1.252762968495368)],
-                               n = 1}}),
-       ("night",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("tra il <datetime> e il <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.466337068793427),
-                                    ("at <time-of-day>at <time-of-day>", -0.9555114450274363),
-                                    ("hourhour", -1.466337068793427)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.587786664902119, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)<integer> (latent time-of-day)",
-                                     -1.3217558399823195),
-                                    ("at <time-of-day>at <time-of-day>", -1.6094379124341003),
-                                    ("hourhour", -1.3217558399823195),
-                                    ("minutehour", -1.6094379124341003)],
-                               n = 5}}),
-       ("gli ultimi <n> <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.343805421853684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.2321210516182215),
-                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)heure (grain)",
-                                     -3.6375861597263857),
-                                    ("number (0..19)heure (grain)", -2.9444389791664407),
-                                    ("number (0..19)jour (grain)", -3.2321210516182215),
-                                    ("second", -3.2321210516182215),
-                                    ("integer (numeric)ann\233e (grain)", -2.9444389791664407),
-                                    ("integer (numeric)seconde (grain)", -3.6375861597263857),
-                                    ("integer (numeric)jour (grain)", -3.2321210516182215),
-                                    ("day", -2.7212954278522306), ("year", -2.538973871058276),
-                                    ("number (0..19)seconde (grain)", -3.6375861597263857),
-                                    ("number (0..19)ann\233e (grain)", -3.2321210516182215),
-                                    ("number (0..19)semaine (grain)", -3.6375861597263857),
-                                    ("hour", -2.2512917986064953),
-                                    ("number (0..19)mois (grain)", -2.9444389791664407),
-                                    ("month", -2.538973871058276),
-                                    ("integer (numeric)minute (grain)", -3.6375861597263857),
-                                    ("integer (numeric)mois (grain)", -3.2321210516182215),
-                                    ("minute", -3.2321210516182215),
-                                    ("number (0..19)minute (grain)", -3.6375861597263857),
-                                    ("integer (numeric)semaine (grain)", -3.6375861597263857),
-                                    ("integer (numeric)heure (grain)", -2.9444389791664407)],
-                               n = 27},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("le idi di <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 2}}),
-       ("<dim time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.5389965007326869, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.1786549963416462),
-                                    ("<day-of-month> <named-month>morning", -2.5649493574615367),
-                                    ("tomorrowevening", -2.5649493574615367),
-                                    ("named-daymorning", -2.159484249353372),
-                                    ("tomorrowmorning", -2.5649493574615367),
-                                    ("tomorrowlunch", -2.5649493574615367),
-                                    ("yesterdayevening", -2.5649493574615367)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -0.8754687373538999,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.9924301646902063),
-                                    ("tomorrownight", -2.3978952727983707),
-                                    ("monthhour", -1.7047480922384253),
-                                    ("named-monththis <part-of-day>", -1.9924301646902063),
-                                    ("tomorrowstanotte", -2.3978952727983707),
-                                    ("named-monthmorning", -2.3978952727983707)],
-                               n = 5}}),
-       ("<hour-of-day> and <relative minutes>",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>number (20..90)", -1.8718021769015913),
-                                    ("<integer> (latent time-of-day)integer (numeric)",
-                                     -1.466337068793427),
-                                    ("<integer> (latent time-of-day)number (20..90)",
-                                     -1.8718021769015913),
-                                    ("hour", -0.9555114450274363)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>number (20..90)", -1.845826690498331),
-                                    ("<integer> (latent time-of-day)integer (numeric)",
-                                     -2.2512917986064953),
-                                    ("<integer> (latent time-of-day)number (20..90)",
-                                     -1.845826690498331),
-                                    ("hour", -0.8649974374866046),
-                                    ("<integer> (latent time-of-day)number (0..19)",
-                                     -1.845826690498331)],
-                               n = 7}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.0986122886681098),
-                                    ("daymonth", -0.8109302162163288),
-                                    ("named-daytwo time tokens in a row", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-day> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayinteger (numeric)", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -2.9444389791664407,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.70805020110221),
-                                    ("number (0..19)semaine (grain)", -2.70805020110221),
-                                    ("hour", -2.70805020110221),
-                                    ("integer (numeric)minute (grain)", -2.3025850929940455),
-                                    ("minute", -2.3025850929940455),
-                                    ("integer (numeric)heure (grain)", -2.70805020110221)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -5.406722127027582e-2,
-                               unseen = -5.117993812416755,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.3202283191284883),
-                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)heure (grain)",
-                                     -4.013375499688434),
-                                    ("number (0..19)heure (grain)", -3.3202283191284883),
-                                    ("number (0..19)jour (grain)", -3.16607763930123),
-                                    ("second", -3.0325462466767075),
-                                    ("integer (numeric)ann\233e (grain)", -3.16607763930123),
-                                    ("integer (numeric)seconde (grain)", -3.7256934272366524),
-                                    ("integer (numeric)jour (grain)", -3.16607763930123),
-                                    ("day", -2.5470384308950065), ("year", -2.627081138568543),
-                                    ("number (0..19)seconde (grain)", -3.5025498759224427),
-                                    ("number (0..19)ann\233e (grain)", -3.3202283191284883),
-                                    ("number (0..19)semaine (grain)", -4.013375499688434),
-                                    ("hour", -2.278774444300327),
-                                    ("number (0..19)mois (grain)", -3.0325462466767075),
-                                    ("month", -2.403937587254333),
-                                    ("integer (numeric)minute (grain)", -3.5025498759224427),
-                                    ("integer (numeric)mois (grain)", -3.0325462466767075),
-                                    ("minute", -3.0325462466767075),
-                                    ("number (0..19)minute (grain)", -3.7256934272366524),
-                                    ("integer (numeric)semaine (grain)", -3.7256934272366524),
-                                    ("integer (numeric)heure (grain)", -2.8094026953624978)],
-                               n = 72}}),
-       ("immacolata concezione",
-        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}}),
-       ("<dim time> al <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.3746934494414107,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.413693335308005),
-                                    ("<integer> (latent time-of-day)afternoon", -2.917770732084279),
-                                    ("hh(:|h)mm (time-of-day)afternoon", -2.917770732084279),
-                                    ("<day-of-month> <named-month>morning", -2.512305623976115),
-                                    ("il <day-of-month> <named-month>morning", -2.917770732084279),
-                                    ("hourhour", -2.917770732084279),
-                                    ("two time tokens in a rowmorning", -2.917770732084279),
-                                    ("minutehour", -2.512305623976115),
-                                    ("tomorrowevening", -2.917770732084279),
-                                    ("named-daymorning", -2.512305623976115),
-                                    ("il <time>morning", -2.917770732084279),
-                                    ("hh(:|h)mm (time-of-day)morning", -2.917770732084279)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.1631508098056809, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.5257286443082556),
-                                    ("<integer> (latent time-of-day)afternoon", -2.120263536200091),
-                                    ("tomorrownight", -2.5257286443082556),
-                                    ("monthhour", -2.120263536200091),
-                                    ("hourhour", -2.120263536200091),
-                                    ("named-monthmorning", -2.120263536200091)],
-                               n = 5}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.290459441148391,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 71},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dal <datetime> al <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("tomorrownamed-day", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dalle <time-of-day> alle <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midnight<integer> (latent time-of-day)", -2.3978952727983707),
-                                    ("minuteminute", -1.7047480922384253),
-                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
-                                     -1.7047480922384253),
-                                    ("<integer> (latent time-of-day)<integer> (latent time-of-day)",
-                                     -1.9924301646902063),
-                                    ("hourhour", -1.4816045409242156),
-                                    ("<integer> (latent time-of-day)una", -2.3978952727983707)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.2039728043259361, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minutehour", -1.252762968495368),
-                                    ("hh(:|h)mm (time-of-day)<integer> (latent time-of-day)",
-                                     -1.252762968495368)],
-                               n = 3}}),
-       ("ferragosto",
-        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 (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-        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 (1st)",
-        Classifier{okData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
-                   koData =
-                     ClassData{prior = -2.3978952727983707,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("number (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.14058195062118944,
-                               unseen = -4.007333185232471,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 53},
-                   koData =
-                     ClassData{prior = -2.031432322493475, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("year (1000-2100 not latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("il <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.1823215567939546, unseen = -4.060443010546419,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dd[/-]mm", -3.349904087274605),
-                                    ("<ordinal> quarter", -3.349904087274605),
-                                    ("<cycle> next", -3.349904087274605),
-                                    ("<ordinal> <cycle> of <time>", -3.349904087274605),
-                                    ("<ordinal> quarter <year>", -3.349904087274605),
-                                    ("day", -1.3350010667323402), ("quarter", -2.9444389791664407),
-                                    ("<dim time> al <part-of-day>", -3.349904087274605),
-                                    ("named-day", -3.349904087274605),
-                                    ("day of month (1st)", -3.349904087274605),
-                                    ("two time tokens in a row", -2.6567569067146595),
-                                    ("hour", -2.9444389791664407), ("month", -3.349904087274605),
-                                    ("next <time>", -2.9444389791664407),
-                                    ("<day-of-month> <named-month>", -2.097141118779237),
-                                    ("minute", -3.349904087274605),
-                                    ("week-end", -3.349904087274605)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -1.791759469228055, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> quarter", -2.5257286443082556),
-                                    ("day", -2.5257286443082556), ("quarter", -2.5257286443082556),
-                                    ("two time tokens in a row", -2.5257286443082556),
-                                    ("hour", -2.120263536200091),
-                                    ("<day-of-month> <named-month>", -2.5257286443082556),
-                                    ("week-end", -2.5257286443082556)],
-                               n = 4}}),
-       ("entro <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.4423470353692043),
-                                    ("il <day-of-month>", -2.4423470353692043),
-                                    ("named-month", -2.4423470353692043),
-                                    ("EOY|End of year", -2.4423470353692043),
-                                    ("day", -2.4423470353692043), ("year", -2.4423470353692043),
-                                    ("EOM|End of month", -2.4423470353692043),
-                                    ("noon", -2.4423470353692043), ("hour", -2.4423470353692043),
-                                    ("month", -2.03688192726104), ("minute", -2.4423470353692043)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.8718021769015913),
-                                    ("hour", -1.8718021769015913)],
-                               n = 1}}),
-       ("trimestre (grain)",
-        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}}),
-       ("ognissanti",
-        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}}),
-       ("<hour-of-day> minus <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noonnumber (0..19)", -1.0986122886681098),
-                                    ("at <time-of-day>number (0..19)", -1.5040773967762742),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3}}),
-       ("une <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("heure (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <cycle> ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.7047480922384253),
-                                    ("ann\233e (grain)", -2.3978952727983707),
-                                    ("semaine (grain)", -1.7047480922384253),
-                                    ("mois (grain)", -2.3978952727983707),
-                                    ("quarter", -1.9924301646902063), ("year", -2.3978952727983707),
-                                    ("trimestre (grain)", -1.9924301646902063),
-                                    ("month", -2.3978952727983707)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("EOM|End of month",
-        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 quart del pomeriggio(time-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("two time tokens in a row",
-        Classifier{okData =
-                     ClassData{prior = -0.3708595789306889, unseen = -5.955837369464831,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("il <time>named-month", -5.260096153727839),
-                                    ("hh(:|h)mm (time-of-day)named-day", -5.260096153727839),
-                                    ("intersect by \"di\", \"della\", \"del\"year (1000-2100 not latent)",
-                                     -4.854631045619675),
-                                    ("named-monthyear (1000-2100 not latent)", -3.5553480614894135),
-                                    ("day of month (1st)named-month", -4.566948973167894),
-                                    ("dayhour", -3.245193133185574),
-                                    ("daymonth", -2.4875074314880576),
-                                    ("day of month (1st)intersect by \"di\", \"della\", \"del\"",
-                                     -4.566948973167894),
-                                    ("monthyear", -3.5553480614894135),
-                                    ("day of month (1st)two time tokens in a row",
-                                     -4.161483865059729),
-                                    ("named-dayentro <time>", -5.260096153727839),
-                                    ("named-daytwo time tokens in a row", -4.854631045619675),
-                                    ("<ordinal> <cycle> of <time>year (1000-2100 not latent)",
-                                     -5.260096153727839),
-                                    ("christmasyear (1000-2100 not latent)", -4.854631045619675),
-                                    ("<named-day> <day-of-month>two time tokens in a row",
-                                     -4.854631045619675),
-                                    ("tra il <integer> e il <integer> (interval)named-month",
-                                     -4.854631045619675),
-                                    ("tomorrowdopo <time>", -5.260096153727839),
-                                    ("at <time-of-day>named-day", -5.260096153727839),
-                                    ("intersect by \"di\", \"della\", \"del\"<day-of-month> <named-month>",
-                                     -4.566948973167894),
-                                    ("entro il <integer>named-month", -5.260096153727839),
-                                    ("day of month (1st)named-day", -4.161483865059729),
-                                    ("dayday", -2.695146796266302),
-                                    ("named-daydalle <time-of-day> alle <time-of-day> (interval)",
-                                     -4.854631045619675),
-                                    ("il <time>year (1000-2100 not latent)", -5.260096153727839),
-                                    ("intersect by \"di\", \"della\", \"del\"named-month",
-                                     -4.566948973167894),
-                                    ("dayyear", -3.120029990231568),
-                                    ("tomorrowdalle <time-of-day> alle <time-of-day> (interval)",
-                                     -5.260096153727839),
-                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
-                                     -4.854631045619675),
-                                    ("dd[/-]mmat <time-of-day>", -5.260096153727839),
-                                    ("tomorrowdopo le <time-of-day>", -4.854631045619675),
-                                    ("monthminute", -4.566948973167894),
-                                    ("minutemonth", -3.7560187569515646),
-                                    ("named-day<time> timezone", -5.260096153727839),
-                                    ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
-                                     -5.260096153727839),
-                                    ("il <day-of-month> <named-month>at <time-of-day>",
-                                     -5.260096153727839),
-                                    ("named-dayin <named-month>", -4.566948973167894),
-                                    ("named-day<day-of-month> <named-month>", -3.6506582412937383),
-                                    ("<day-of-month> <named-month>at <time-of-day>",
-                                     -4.566948973167894),
-                                    ("il <day-of-month> <named-month>year (1000-2100 not latent)",
-                                     -5.260096153727839),
-                                    ("two time tokens separated by `di`year (1000-2100 not latent)",
-                                     -4.854631045619675),
-                                    ("last <cycle> of <time>year (1000-2100 not latent)",
-                                     -4.566948973167894),
-                                    ("day of month (1st)two time tokens separated by `di`",
-                                     -4.566948973167894),
-                                    ("dal <integer> al <integer> (interval)named-month",
-                                     -4.854631045619675),
-                                    ("il <day-of-month>named-month", -4.007333185232471),
-                                    ("the day after tomorrowat <time-of-day>", -4.854631045619675),
-                                    ("two time tokens in a rowyear (1000-2100 not latent)",
-                                     -4.566948973167894),
-                                    ("il <day-of-month>two time tokens in a row",
-                                     -4.854631045619675),
-                                    ("at <time-of-day>two time tokens in a row",
-                                     -4.854631045619675),
-                                    ("dayminute", -2.8622008809294686),
-                                    ("two time tokens in a rowat <time-of-day>",
-                                     -4.161483865059729),
-                                    ("minuteday", -3.0628715763916197),
-                                    ("two time tokens separated by `di`<day-of-month> <named-month>",
-                                     -4.566948973167894),
-                                    ("il <time>at <time-of-day>", -5.260096153727839),
-                                    ("named-dayat <time-of-day>", -4.854631045619675),
-                                    ("last <day-of-week> of <time>year (1000-2100 not latent)",
-                                     -5.260096153727839),
-                                    ("immacolata concezioneat <time-of-day>", -5.260096153727839),
-                                    ("at <time-of-day><named-day> <day-of-month>",
-                                     -5.260096153727839),
-                                    ("two time tokens separated by `di`named-month",
-                                     -4.566948973167894),
-                                    ("weekyear", -4.854631045619675),
-                                    ("named-dayentro le <time-of-day>", -5.260096153727839),
-                                    ("two time tokens in a rownamed-month", -4.854631045619675),
-                                    ("tomorrowat <time-of-day>", -5.260096153727839),
-                                    ("two time tokens in a row<day-of-month> <named-month>",
-                                     -4.854631045619675),
-                                    ("named-daytra il <datetime> e il <datetime> (interval)",
-                                     -4.854631045619675),
-                                    ("two time tokens in a rowin <named-month>",
-                                     -4.566948973167894),
-                                    ("<named-day> <day-of-month>named-month", -3.6506582412937383),
-                                    ("the day after tomorrowentro le <time-of-day>",
-                                     -5.260096153727839),
-                                    ("<day-of-month> <named-month>year (1000-2100 not latent)",
-                                     -4.854631045619675),
-                                    ("named-monthat <time-of-day>", -4.566948973167894),
-                                    ("commemorazione dei defuntiat <time-of-day>",
-                                     -5.260096153727839),
-                                    ("<datetime> - <datetime> (interval)named-day",
-                                     -5.260096153727839)],
-                               n = 147},
-                   koData =
-                     ClassData{prior = -1.1716374236829996,
-                               unseen = -5.4116460518550396,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>prossimi <unit-of-duration>",
-                                     -4.308559482792009),
-                                    ("hh(:|h)mm (time-of-day)named-day", -4.7140245909001735),
-                                    ("intersect by \"di\", \"della\", \"del\"year (1000-2100 not latent)",
-                                     -4.020877410340228),
-                                    ("named-monthyear (1000-2100 not latent)", -4.7140245909001735),
-                                    ("dayhour", -2.188295946591918),
-                                    ("daymonth", -4.7140245909001735),
-                                    ("monthday", -4.308559482792009),
-                                    ("monthyear", -4.7140245909001735),
-                                    ("named-daytwo time tokens in a row", -4.020877410340228),
-                                    ("tra il <datetime> e il <datetime> (interval)named-month",
-                                     -4.308559482792009),
-                                    ("<named-day> <day-of-month>two time tokens in a row",
-                                     -4.020877410340228),
-                                    ("named-month<day-of-month> <named-month>", -4.308559482792009),
-                                    ("monthhour", -3.615412302232064),
-                                    ("hourmonth", -4.308559482792009),
-                                    ("dayday", -4.7140245909001735),
-                                    ("named-daydalle <time-of-day> alle <time-of-day> (interval)",
-                                     -4.7140245909001735),
-                                    ("named-monththis <part-of-day>", -4.308559482792009),
-                                    ("dayyear", -3.2099471941238993),
-                                    ("tomorrowdalle <time-of-day> alle <time-of-day> (interval)",
-                                     -4.7140245909001735),
-                                    ("tomorrowstanotte", -4.7140245909001735),
-                                    ("year (1000-2100 not latent)<hour-of-day> <integer> (as relative minutes)",
-                                     -4.308559482792009),
-                                    ("the <cycle> of <time>named-month", -4.308559482792009),
-                                    ("dd[/-]mmat <time-of-day>", -4.7140245909001735),
-                                    ("tomorrowdopo le <time-of-day>", -4.308559482792009),
-                                    ("monthminute", -4.7140245909001735),
-                                    ("minutemonth", -4.308559482792009),
-                                    ("named-daydopo <time>", -4.7140245909001735),
-                                    ("il <day-of-month> <named-month>at <time-of-day>",
-                                     -4.7140245909001735),
-                                    ("dopo <time>at <time-of-day>", -4.7140245909001735),
-                                    ("<day-of-month> <named-month>at <time-of-day>",
-                                     -3.7977338590260183),
-                                    ("weekmonth", -4.308559482792009),
-                                    ("two time tokens separated by `di`year (1000-2100 not latent)",
-                                     -4.020877410340228),
-                                    ("hourweek", -4.308559482792009),
-                                    ("il <day-of-month>named-month", -4.7140245909001735),
-                                    ("the day after tomorrowat <time-of-day>", -4.7140245909001735),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -4.7140245909001735),
-                                    ("il <day-of-month>two time tokens in a row",
-                                     -4.7140245909001735),
-                                    ("dayminute", -2.9222651216721185),
-                                    ("two time tokens in a rowat <time-of-day>",
-                                     -3.3277302297802827),
-                                    ("minuteday", -4.308559482792009),
-                                    ("il <time>at <time-of-day>", -4.7140245909001735),
-                                    ("named-daydopo le <time-of-day>", -4.020877410340228),
-                                    ("named-dayat <time-of-day>", -4.308559482792009),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-day",
-                                     -4.7140245909001735),
-                                    ("tomorrowat <time-of-day>", -4.7140245909001735),
-                                    ("named-daytra il <datetime> e il <datetime> (interval)",
-                                     -4.7140245909001735),
-                                    ("dopo <time>year (1000-2100 not latent)", -4.308559482792009),
-                                    ("<hour-of-day> and <relative minutes>named-month",
-                                     -4.7140245909001735),
-                                    ("named-monthat <time-of-day>", -3.7977338590260183),
-                                    ("yearminute", -4.308559482792009)],
-                               n = 66}}),
-       ("heure (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the day after tomorrow",
-        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}}),
-       ("noon",
-        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}}),
-       ("jour (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}}),
-       ("hh <relative-minutes> del pomeriggio(time-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>number (20..90)", -1.2992829841302609),
-                                    ("<integer> (latent time-of-day)number (20..90)",
-                                     -1.2992829841302609),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> minus quart",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.5040773967762742),
-                                    ("noon", -1.0986122886681098), ("hour", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("evening",
-        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}}),
-       ("dd[/-]mm[/-]yyyy",
-        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}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("season", -2.0794415416798357), ("day", -0.8266785731844679),
-                                    ("named-day", -1.1631508098056809),
-                                    ("il <time>", -2.0794415416798357)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098)],
-                               n = 1}}),
-       ("christmas",
-        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}}),
-       ("new year's day",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.498699971920336),
-                                    ("number (0..19)heure (grain)", -3.597312260588446),
-                                    ("number (0..19)jour (grain)", -3.597312260588446),
-                                    ("second", -2.9041650800285006),
-                                    ("integer (numeric)ann\233e (grain)", -3.597312260588446),
-                                    ("integer (numeric)seconde (grain)", -3.597312260588446),
-                                    ("integer (numeric)jour (grain)", -3.1918471524802814),
-                                    ("day", -2.9041650800285006), ("year", -2.9041650800285006),
-                                    ("number (0..19)seconde (grain)", -3.1918471524802814),
-                                    ("number (0..19)ann\233e (grain)", -3.1918471524802814),
-                                    ("number (0..19)semaine (grain)", -3.1918471524802814),
-                                    ("hour", -2.9041650800285006),
-                                    ("number (0..19)mois (grain)", -2.9041650800285006),
-                                    ("month", -2.344549292093078),
-                                    ("integer (numeric)minute (grain)", -3.1918471524802814),
-                                    ("integer (numeric)mois (grain)", -2.9041650800285006),
-                                    ("minute", -2.9041650800285006),
-                                    ("number (0..19)minute (grain)", -3.597312260588446),
-                                    ("integer (numeric)semaine (grain)", -2.9041650800285006),
-                                    ("integer (numeric)heure (grain)", -3.1918471524802814)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("entro il <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.9808292530117262),
-                                    ("semaine (grain)", -0.9808292530117262)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mois (grain)", -0.9808292530117262),
-                                    ("month", -0.9808292530117262)],
-                               n = 2}}),
-       ("prossimi <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.9924301646902063),
-                                    ("ann\233e (grain)", -2.3978952727983707),
-                                    ("semaine (grain)", -1.9924301646902063),
-                                    ("mois (grain)", -1.9924301646902063),
-                                    ("day", -1.9924301646902063), ("year", -2.3978952727983707),
-                                    ("jour (grain)", -1.9924301646902063),
-                                    ("month", -1.9924301646902063)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dopo <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.9555114450274363, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.845826690498331),
-                                    ("day", -1.55814461804655), ("named-day", -2.2512917986064953),
-                                    ("day of month (1st)", -2.2512917986064953),
-                                    ("the day after tomorrow", -2.2512917986064953),
-                                    ("hour", -1.845826690498331)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.48550781578170077,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("tomorrow", -1.8325814637483102), ("day", -1.1394342831883648),
-                                    ("two time tokens in a row", -1.8325814637483102),
-                                    ("hour", -2.5257286443082556),
-                                    ("christmas", -2.120263536200091)],
-                               n = 8}}),
-       ("festa della liberazione",
-        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}}),
-       ("dal <integer",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -0.40546510810816444)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.6931471805599453),
-                                    ("number (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("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}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.55814461804655),
-                                    ("<day-of-month> <named-month><day-of-month> <named-month>",
-                                     -1.845826690498331),
-                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
-                                     -1.55814461804655),
-                                    ("dayday", -1.845826690498331)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.845826690498331),
-                                    ("named-month<day-of-month> <named-month>", -1.845826690498331),
-                                    ("minuteminute", -2.2512917986064953),
-                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
-                                     -2.2512917986064953),
-                                    ("year (1000-2100 not latent)<hour-of-day> <integer> (as relative minutes)",
-                                     -1.845826690498331),
-                                    ("yearminute", -1.845826690498331)],
-                               n = 5}}),
-       ("<day-of-month> <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.1880522315029396, unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.7096764825111559),
-                                    ("month", -0.7096764825111559)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -1.7635885922613588, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..19)named-month", -2.0149030205422647),
-                                    ("integer (numeric)named-month", -0.916290731874155),
-                                    ("month", -0.7621400520468967)],
-                               n = 6}}),
-       ("in <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mezz'ora",
-        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> entro le <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.8472978603872037),
-                                    ("named-daynoon", -1.252762968495368),
-                                    ("the day after tomorrow<integer> (latent time-of-day)",
-                                     -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               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 (primo..10)named-daytwo time tokens in a row",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (primo..10)named-daychristmas", -0.916290731874155)],
-                               n = 1}}),
-       ("<part-of-day> of <dim time>",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -1.0986122886681098),
-                                    ("morningnamed-day", -2.0149030205422647),
-                                    ("morning<day-of-month> <named-month>", -1.6094379124341003),
-                                    ("eveningtomorrow", -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.5108256237659907, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -0.9985288301111273),
-                                    ("stanottetomorrow", -1.845826690498331),
-                                    ("nighttomorrow", -1.845826690498331),
-                                    ("afternoontomorrow", -1.845826690498331)],
-                               n = 6}}),
-       ("<dim time> del mattino",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.7047480922384253),
-                                    ("<integer> (latent time-of-day)", -1.7047480922384253),
-                                    ("hh(:|h)mm (time-of-day)", -1.7047480922384253),
-                                    ("hour", -1.2992829841302609), ("minute", -1.7047480922384253)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.2809338454620642),
-                                    ("jour (grain)two time tokens in a row", -1.791759469228055),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("semaine (grain)named-month", -2.1972245773362196),
-                                    ("semaine (grain)two time tokens in a row",
-                                     -2.1972245773362196),
-                                    ("jour (grain)named-month", -1.791759469228055)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("two time tokens separated by `di`",
-        Classifier{okData =
-                     ClassData{prior = -0.4274440148269396, unseen = -4.406719247264253,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)named-day", -3.295836866004329),
-                                    ("named-daynamed-month", -3.295836866004329),
-                                    ("hourday", -2.4485390056171257),
-                                    ("day of month (1st)named-month", -3.7013019741124937),
-                                    ("daymonth", -2.315007612992603),
-                                    ("named-daytwo time tokens in a row", -3.7013019741124937),
-                                    ("at <time-of-day>named-day", -3.295836866004329),
-                                    ("two time tokens in a rowtwo time tokens in a row",
-                                     -3.7013019741124937),
-                                    ("dalle <time-of-day> alle <time-of-day> (interval)named-day",
-                                     -3.0081547935525483),
-                                    ("<integer 0 12> del <part of day>tomorrow",
-                                     -3.7013019741124937),
-                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
-                                     -2.7850112422383386),
-                                    ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
-                                     -3.295836866004329),
-                                    ("at <time-of-day>two time tokens in a row",
-                                     -3.295836866004329),
-                                    ("minuteday", -1.6863989535702288),
-                                    ("at <time-of-day><named-day> <day-of-month>",
-                                     -3.7013019741124937),
-                                    ("dayweek", -3.0081547935525483),
-                                    ("two time tokens in a rownamed-month", -3.295836866004329),
-                                    ("<dim time> al <part-of-day>tomorrow", -3.7013019741124937),
-                                    ("named-daythis <cycle>", -3.0081547935525483),
-                                    ("tra il <datetime> e il <datetime> (interval)named-day",
-                                     -3.295836866004329)],
-                               n = 30},
-                   koData =
-                     ClassData{prior = -1.0560526742493137,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)named-day", -2.871679624884012),
-                                    ("named-daynamed-month", -2.3608540011180215),
-                                    ("hourday", -2.178532444324067),
-                                    ("daymonth", -1.890850371872286),
-                                    ("named-daytwo time tokens in a row", -2.583997552432231),
-                                    ("at <time-of-day>named-day", -2.178532444324067),
-                                    ("stanottetomorrow", -2.871679624884012),
-                                    ("minuteday", -2.3608540011180215)],
-                               n = 16}}),
-       ("il <day-of-month> <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1}}),
-       ("morning",
-        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}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("fino al <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh(:|h)mm (time-of-day)", -1.791759469228055),
-                                    ("EOY|End of year", -1.791759469228055),
-                                    ("year", -1.791759469228055),
-                                    ("EOM|End of month", -1.791759469228055),
-                                    ("month", -1.791759469228055), ("minute", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = -0.8754687373538999,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -0.5389965007326869,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("tre quarti d'ora",
-        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 <cycle> last",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("ann\233e (grain)", -2.1972245773362196),
-                                    ("semaine (grain)", -1.791759469228055),
-                                    ("mois (grain)", -1.5040773967762742),
-                                    ("year", -2.1972245773362196), ("month", -1.5040773967762742)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("festa del pap\224",
-        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}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (numeric)",
-                                     -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (numeric)",
-                                     -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 4}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.8971199848858813),
-                                    ("semaine (grain)", -1.8971199848858813),
-                                    ("mois (grain)", -1.8971199848858813),
-                                    ("heure (grain)", -1.8971199848858813),
-                                    ("hour", -1.8971199848858813), ("month", -1.8971199848858813)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.9459101490553135),
-                                    ("semaine (grain)", -1.9459101490553135),
-                                    ("day", -1.540445040947149),
-                                    ("jour (grain)", -1.540445040947149)],
-                               n = 3}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("season", -1.8562979903656263), ("day", -1.8562979903656263),
-                                    ("hour", -1.1631508098056809), ("evening", -2.772588722239781),
-                                    ("morning", -2.0794415416798357),
-                                    ("week-end", -1.6739764335716716)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/IT_XX.hs b/Duckling/Ranking/Classifiers/IT_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/IT_XX.hs
@@ -0,0 +1,2226 @@
+-- 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.IT_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time-of-day> - <time-of-day> <day-of-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)<integer> (latent time-of-day)Giovedi",
+                                     -1.6094379124341003),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)Giovedi",
+                                     -1.6094379124341003),
+                                    ("hourhourday", -1.6094379124341003),
+                                    ("minuteminuteday", -1.6094379124341003)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)<integer> (latent time-of-day)Luglio",
+                                     -1.3862943611198906),
+                                    ("hourhourmonth", -1.3862943611198906)],
+                               n = 1}}),
+       ("midnight",
+        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}}),
+       ("the <cycle> next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("semaine (grain)", -1.3862943611198906),
+                                    ("mois (grain)", -1.3862943611198906),
+                                    ("month", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.0986122886681098),
+                                    ("hh(:|h)mm (time-of-day)", -1.791759469228055),
+                                    ("hour", -1.3862943611198906), ("minute", -1.3862943611198906)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5347411751625487,
+                               unseen = -5.0689042022202315,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 157},
+                   koData =
+                     ClassData{prior = -0.8814567791985226, unseen = -4.727387818712341,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 111}}),
+       ("the day before yesterday",
+        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}}),
+       ("lunch",
+        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[/-]mm",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("today",
+        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}}),
+       ("Venerdi",
+        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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.6234672599219555, unseen = -4.770684624465665,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight", -4.069026754237811),
+                                    ("<time> timezone", -4.069026754237811),
+                                    ("<integer 0 12> del <part of day>", -2.68273239311792),
+                                    ("<integer> (latent time-of-day)", -1.5432981099295555),
+                                    ("hh(:|h)mm (time-of-day)", -2.1231166051824975),
+                                    ("<hour-of-day> and <relative minutes>", -4.069026754237811),
+                                    ("noon", -3.6635616461296463),
+                                    ("hh <relative-minutes> del pomeriggio(time-of-day)",
+                                     -3.6635616461296463),
+                                    ("<hour-of-day> minus quart", -4.069026754237811),
+                                    ("hour", -1.2068258733083426), ("minute", -1.8177349556313156)],
+                               n = 52},
+                   koData =
+                     ClassData{prior = -0.768048488733063, unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("una", -3.9415818076696905),
+                                    ("<integer> (latent time-of-day)", -1.0512100497735257),
+                                    ("hh(:|h)mm (time-of-day)", -2.842969519001581),
+                                    ("<hour-of-day> and <relative minutes>", -3.536116699561526),
+                                    ("<hour-of-day> minus <integer> (as relative minutes)",
+                                     -3.9415818076696905),
+                                    ("noon", -3.9415818076696905), ("hour", -0.99714282850325),
+                                    ("minute", -2.4375044108934163)],
+                               n = 45}}),
+       ("ann\233e (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}}),
+       ("dopo le <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight", -2.0149030205422647),
+                                    ("<integer> (latent time-of-day)", -1.0986122886681098),
+                                    ("hour", -0.916290731874155)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.2876820724517809, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight", -2.8622008809294686),
+                                    ("<integer> (latent time-of-day)", -1.0704414117014134),
+                                    ("hh(:|h)mm (time-of-day)", -2.169053700369523),
+                                    ("hour", -0.9903987040278769), ("minute", -2.169053700369523)],
+                               n = 15}}),
+       ("Giovedi",
+        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}}),
+       ("seconde (grain)",
+        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}}),
+       ("stanotte",
+        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}}),
+       ("Martedi",
+        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}}),
+       ("dal <integer> al <integer> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..19)number (0..19)", -0.6931471805599453),
+                                    ("integer (numeric)integer (numeric)", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer 0 12> del <part of day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2876820724517809),
+                                    ("number (0..19)", -1.3862943611198906)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("una",
+        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}}),
+       ("semaine (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("il <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("mois (grain)",
+        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}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 3}}),
+       ("in|entro <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>", -0.8472978603872037),
+                                    ("minute", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2039728043259361),
+                                    ("semaine (grain)", -1.2039728043259361),
+                                    ("mois (grain)", -1.6094379124341003),
+                                    ("month", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("epifania",
+        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}}),
+       ("last <time> ",
+        Classifier{okData =
+                     ClassData{prior = -2.8622008809294686,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.791759469228055), ("hour", -1.791759469228055),
+                                    ("week-end", -1.791759469228055),
+                                    ("Domenica", -1.791759469228055)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -5.8840500022933465e-2,
+                               unseen = -4.31748811353631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.9718605830289658),
+                                    ("intersect by \"di\", \"della\", \"del\"", -3.20545280453606),
+                                    ("day", -2.3581549441488563), ("Lunedi", -3.6109179126442243),
+                                    ("hour", -0.9718605830289658),
+                                    ("two time tokens separated by `di`", -3.20545280453606),
+                                    ("Domenica", -3.6109179126442243)],
+                               n = 33}}),
+       ("Ottobre",
+        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}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (primo..10)jour (grain)Ottobre",
+                                     -1.7047480922384253),
+                                    ("daymonth", -1.7047480922384253),
+                                    ("weekmonth", -1.2992829841302609),
+                                    ("ordinals (primo..10)semaine (grain)two time tokens in a row",
+                                     -1.7047480922384253),
+                                    ("ordinals (primo..10)semaine (grain)Ottobre",
+                                     -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("season",
+        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}}),
+       ("<time> last",
+        Classifier{okData =
+                     ClassData{prior = -1.791759469228055, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martedi", -1.252762968495368), ("day", -1.252762968495368)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.1823215567939546, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.6094379124341003),
+                                    ("<integer> (latent time-of-day)", -1.3217558399823195),
+                                    ("hour", -0.916290731874155)],
+                               n = 5}}),
+       ("the <ordinal> <cycle> <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarteryear", -0.6931471805599453),
+                                    ("ordinals (primo..10)trimestre (grain)year (1000-2100 not latent)",
+                                     -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("verso <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("evening", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("weekday", -0.9808292530117262),
+                                    ("semaine (grain)<day-of-month> <named-month>",
+                                     -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("semaine (grain)<integer> (latent time-of-day)",
+                                     -0.9808292530117262),
+                                    ("weekhour", -0.9808292530117262)],
+                               n = 2}}),
+       ("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}}),
+       ("in the <part-of-day> of <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -0.9808292530117262),
+                                    ("eveningtomorrow", -1.3862943611198906),
+                                    ("morningLunedi", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -0.9808292530117262),
+                                    ("nighttomorrow", -0.9808292530117262)],
+                               n = 2}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarteryear", -0.6931471805599453),
+                                    ("ordinals (primo..10)trimestre (grain)year (1000-2100 not latent)",
+                                     -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("festa della repubblica",
+        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/after <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.4849066497880004),
+                                    ("un quarto d'ora", -2.4849066497880004),
+                                    ("<integer> <unit-of-duration>", -1.5686159179138452),
+                                    ("une <unit-of-duration>", -2.4849066497880004),
+                                    ("hour", -2.0794415416798357),
+                                    ("mezz'ora", -2.4849066497880004),
+                                    ("minute", -1.3862943611198906),
+                                    ("tre quarti d'ora", -2.4849066497880004)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("i|le n <cycle> passati|passate",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.219507705176107,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)heure (grain)",
+                                     -3.5115454388310208),
+                                    ("number (0..19)heure (grain)", -3.5115454388310208),
+                                    ("number (0..19)jour (grain)", -2.8183982582710754),
+                                    ("second", -3.1060803307228566),
+                                    ("integer (numeric)ann\233e (grain)", -3.1060803307228566),
+                                    ("integer (numeric)seconde (grain)", -3.5115454388310208),
+                                    ("integer (numeric)jour (grain)", -3.1060803307228566),
+                                    ("day", -2.412933150162911), ("year", -2.5952547069568657),
+                                    ("number (0..19)seconde (grain)", -3.5115454388310208),
+                                    ("number (0..19)ann\233e (grain)", -3.1060803307228566),
+                                    ("hour", -2.2587824703356527),
+                                    ("number (0..19)mois (grain)", -3.1060803307228566),
+                                    ("month", -2.412933150162911),
+                                    ("integer (numeric)minute (grain)", -3.5115454388310208),
+                                    ("integer (numeric)mois (grain)", -2.8183982582710754),
+                                    ("minute", -3.1060803307228566),
+                                    ("number (0..19)minute (grain)", -3.5115454388310208),
+                                    ("integer (numeric)heure (grain)", -2.5952547069568657)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("un quarto d'ora",
+        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}}),
+       ("Aprile",
+        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}}),
+       ("santo stefano",
+        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}}),
+       ("entro il <integer>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("stasera",
+        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> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -1.0822184788924334,
+                               unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("number (0..19)", -1.3862943611198906)],
+                               n = 41},
+                   koData =
+                     ClassData{prior = -0.41376391092285947,
+                               unseen = -4.430816798843313,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.34130316389087856),
+                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+                                     -3.3202283191284883),
+                                    ("number (0..19)", -1.374318170073175)],
+                               n = 80}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9808292530117262),
+                                    ("ordinals (primo..10)Mercoleditwo time tokens in a row",
+                                     -1.6739764335716716),
+                                    ("ordinals (primo..10)Marteditwo time tokens in a row",
+                                     -2.0794415416798357),
+                                    ("ordinals (primo..10)MartediOttobre", -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (primo..10)MartediSettembre", -1.791759469228055),
+                                    ("ordinals (primo..10)MercolediOttobre", -1.3862943611198906)],
+                               n = 3}}),
+       ("Settembre",
+        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}}),
+       ("a quart to <integer> (as hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon", -0.6931471805599453), ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> notte",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("new year's eve", -1.8718021769015913),
+                                    ("tomorrow", -0.9555114450274363),
+                                    ("day", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Febbraio",
+        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}}),
+       ("intersect by \"di\", \"della\", \"del\"",
+        Classifier{okData =
+                     ClassData{prior = -0.41616039722491244,
+                               unseen = -4.574710978503383,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh(:|h)mm (time-of-day)Sabato", -3.871201010907891),
+                                    ("hourday", -2.6184380424125226),
+                                    ("daymonth", -2.4849066497880004),
+                                    ("MartediOttobre", -3.871201010907891),
+                                    ("Mercoleditwo time tokens in a row", -3.871201010907891),
+                                    ("hh(:|h)mm (time-of-day)<day-of-month> <named-month>",
+                                     -3.871201010907891),
+                                    ("two time tokens in a rowtwo time tokens in a row",
+                                     -3.871201010907891),
+                                    ("two time tokens in a rowOttobre", -3.4657359027997265),
+                                    ("<integer 0 12> del <part of day>tomorrow",
+                                     -3.871201010907891),
+                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
+                                     -2.9549102790337356),
+                                    ("Lunedithis <cycle>", -3.871201010907891),
+                                    ("Martedithis <cycle>", -3.871201010907891),
+                                    ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
+                                     -3.4657359027997265),
+                                    ("day of month (1st)Marzo", -3.871201010907891),
+                                    ("MercolediOttobre", -3.871201010907891),
+                                    ("at <time-of-day>two time tokens in a row",
+                                     -3.4657359027997265),
+                                    ("minuteday", -1.791759469228055),
+                                    ("dalle <time-of-day> alle <time-of-day> (interval)Giovedi",
+                                     -3.1780538303479458),
+                                    ("at <time-of-day>Sabato", -3.871201010907891),
+                                    ("at <time-of-day><named-day> <day-of-month>",
+                                     -3.871201010907891),
+                                    ("dayweek", -3.1780538303479458),
+                                    ("at <time-of-day>Venerdi", -3.871201010907891),
+                                    ("tra il <datetime> e il <datetime> (interval)Giovedi",
+                                     -3.4657359027997265),
+                                    ("<dim time> al <part-of-day>tomorrow", -3.871201010907891),
+                                    ("Mercoledithis <cycle>", -3.871201010907891),
+                                    ("hh(:|h)mm (time-of-day)Venerdi", -3.871201010907891)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -1.0775588794702773, unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.3978952727983707),
+                                    ("daymonth", -2.1102132003465894),
+                                    ("Mercoleditwo time tokens in a row", -3.4965075614664802),
+                                    ("stanottetomorrow", -3.0910424533583156),
+                                    ("MartediSettembre", -3.4965075614664802),
+                                    ("LunediMarzo", -3.4965075614664802),
+                                    ("MercolediOttobre", -3.4965075614664802),
+                                    ("Marteditwo time tokens in a row", -3.4965075614664802),
+                                    ("minuteday", -2.580216829592325),
+                                    ("DomenicaMarzo", -3.4965075614664802),
+                                    ("at <time-of-day>Giovedi", -2.3978952727983707),
+                                    ("Domenicatwo time tokens in a row", -3.4965075614664802),
+                                    ("hh(:|h)mm (time-of-day)Giovedi", -3.0910424533583156)],
+                               n = 16}}),
+       ("<hour-of-day> and a quart",
+        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> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("commemorazione dei defunti",
+        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}}),
+       ("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}}),
+       ("hh(:|h)mm (time-of-day)",
+        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}}),
+       ("EOY|End of 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}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.4595323293784402, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -2.639057329615259),
+                                    ("hour", -0.7672551527136672), ("evening", -1.1349799328389845),
+                                    ("morning", -1.9459101490553135)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.9985288301111273,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8109302162163288), ("evening", -1.791759469228055),
+                                    ("morning", -1.0986122886681098)],
+                               n = 7}}),
+       ("circa per le <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer 0 12> del <part of day>", -1.5040773967762742),
+                                    ("<integer> (latent time-of-day)", -1.0986122886681098),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1}}),
+       ("christmas eve",
+        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}}),
+       ("festa del lavoro",
+        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}}),
+       ("Agosto",
+        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}}),
+       ("il week-end del <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("<day-of-month> <named-month>", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2231435513142097),
+                                    ("number (0..19)", -1.6094379124341003)],
+                               n = 13}}),
+       ("entro le <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("il <day-of-month>", -2.639057329615259),
+                                    ("<integer> (latent time-of-day)", -2.2335922215070942),
+                                    ("hh(:|h)mm (time-of-day)", -2.639057329615259),
+                                    ("EOY|End of year", -2.639057329615259),
+                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
+                                    ("EOM|End of month", -2.639057329615259),
+                                    ("noon", -2.639057329615259), ("hour", -1.9459101490553135),
+                                    ("month", -2.2335922215070942), ("Marzo", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -1.9459101490553135),
+                                    ("hour", -1.9459101490553135)],
+                               n = 1}}),
+       ("new year's eve",
+        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}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               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}}),
+       ("domattina",
+        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.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (primo..10)",
+        Classifier{okData =
+                     ClassData{prior = -1.0185695809945732, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -0.4480247225269604,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (primo..10)jour (grain)Ottobre",
+                                     -0.6931471805599453),
+                                    ("daymonth", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("gli <n> ultimi <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8109302162163288),
+                                    ("number (0..19)semaine (grain)", -1.5040773967762742),
+                                    ("integer (numeric)semaine (grain)", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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}}),
+       ("tra il <integer> e il <integer> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Luglio",
+        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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2809338454620642),
+                                    ("ann\233e (grain)", -2.1972245773362196),
+                                    ("semaine (grain)", -1.2809338454620642),
+                                    ("quarter", -2.1972245773362196), ("year", -2.1972245773362196),
+                                    ("trimestre (grain)", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("semaine (grain)", -1.3862943611198906)],
+                               n = 1}}),
+       ("minute (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}}),
+       ("il <cycle> dopo <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.5040773967762742),
+                                    ("dayday", -1.5040773967762742),
+                                    ("mois (grain)two time tokens in a row", -1.5040773967762742),
+                                    ("jour (grain)tomorrow", -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.252762968495368),
+                                    ("mois (grain)christmas", -1.252762968495368)],
+                               n = 1}}),
+       ("night",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("tra il <datetime> e il <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.8109302162163288, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.466337068793427),
+                                    ("at <time-of-day>at <time-of-day>", -0.9555114450274363),
+                                    ("hourhour", -1.466337068793427)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.587786664902119, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)<integer> (latent time-of-day)",
+                                     -1.3217558399823195),
+                                    ("at <time-of-day>at <time-of-day>", -1.6094379124341003),
+                                    ("hourhour", -1.3217558399823195),
+                                    ("minutehour", -1.6094379124341003)],
+                               n = 5}}),
+       ("gli ultimi <n> <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.343805421853684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.2321210516182215),
+                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)heure (grain)",
+                                     -3.6375861597263857),
+                                    ("number (0..19)heure (grain)", -2.9444389791664407),
+                                    ("number (0..19)jour (grain)", -3.2321210516182215),
+                                    ("second", -3.2321210516182215),
+                                    ("integer (numeric)ann\233e (grain)", -2.9444389791664407),
+                                    ("integer (numeric)seconde (grain)", -3.6375861597263857),
+                                    ("integer (numeric)jour (grain)", -3.2321210516182215),
+                                    ("day", -2.7212954278522306), ("year", -2.538973871058276),
+                                    ("number (0..19)seconde (grain)", -3.6375861597263857),
+                                    ("number (0..19)ann\233e (grain)", -3.2321210516182215),
+                                    ("number (0..19)semaine (grain)", -3.6375861597263857),
+                                    ("hour", -2.2512917986064953),
+                                    ("number (0..19)mois (grain)", -2.9444389791664407),
+                                    ("month", -2.538973871058276),
+                                    ("integer (numeric)minute (grain)", -3.6375861597263857),
+                                    ("integer (numeric)mois (grain)", -3.2321210516182215),
+                                    ("minute", -3.2321210516182215),
+                                    ("number (0..19)minute (grain)", -3.6375861597263857),
+                                    ("integer (numeric)semaine (grain)", -3.6375861597263857),
+                                    ("integer (numeric)heure (grain)", -2.9444389791664407)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("le idi di <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -0.6931471805599453), ("Marzo", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (primo..10)trimestre (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 2}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.5389965007326869, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1786549963416462),
+                                    ("<day-of-month> <named-month>morning", -2.5649493574615367),
+                                    ("tomorrowevening", -2.5649493574615367),
+                                    ("Lunedimorning", -2.159484249353372),
+                                    ("tomorrowmorning", -2.5649493574615367),
+                                    ("tomorrowlunch", -2.5649493574615367),
+                                    ("yesterdayevening", -2.5649493574615367)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.8754687373538999,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.9924301646902063),
+                                    ("tomorrownight", -2.3978952727983707),
+                                    ("monthhour", -1.7047480922384253),
+                                    ("Febbraiothis <part-of-day>", -1.9924301646902063),
+                                    ("tomorrowstanotte", -2.3978952727983707),
+                                    ("Febbraiomorning", -2.3978952727983707)],
+                               n = 5}}),
+       ("<hour-of-day> and <relative minutes>",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>number (20..90)", -1.8718021769015913),
+                                    ("<integer> (latent time-of-day)integer (numeric)",
+                                     -1.466337068793427),
+                                    ("<integer> (latent time-of-day)number (20..90)",
+                                     -1.8718021769015913),
+                                    ("hour", -0.9555114450274363)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>number (20..90)", -1.845826690498331),
+                                    ("<integer> (latent time-of-day)integer (numeric)",
+                                     -2.2512917986064953),
+                                    ("<integer> (latent time-of-day)number (20..90)",
+                                     -1.845826690498331),
+                                    ("hour", -0.8649974374866046),
+                                    ("<integer> (latent time-of-day)number (0..19)",
+                                     -1.845826690498331)],
+                               n = 7}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("LunediMarzo", -1.6094379124341003),
+                                    ("DomenicaMarzo", -1.6094379124341003),
+                                    ("Domenicatwo time tokens in a row", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-day> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Domenicainteger (numeric)", -2.772588722239781),
+                                    ("Lunediinteger (numeric)", -2.367123614131617),
+                                    ("Mercolediinteger (numeric)", -2.772588722239781),
+                                    ("Sabatointeger (numeric)", -2.772588722239781),
+                                    ("day", -0.9007865453381898),
+                                    ("Venerdiinteger (numeric)", -1.8562979903656263),
+                                    ("Giovediinteger (numeric)", -2.772588722239781),
+                                    ("Martediinteger (numeric)", -2.367123614131617)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.70805020110221),
+                                    ("number (0..19)semaine (grain)", -2.70805020110221),
+                                    ("hour", -2.70805020110221),
+                                    ("integer (numeric)minute (grain)", -2.3025850929940455),
+                                    ("minute", -2.3025850929940455),
+                                    ("integer (numeric)heure (grain)", -2.70805020110221)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -5.117993812416755,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.3202283191284883),
+                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)heure (grain)",
+                                     -4.013375499688434),
+                                    ("number (0..19)heure (grain)", -3.3202283191284883),
+                                    ("number (0..19)jour (grain)", -3.16607763930123),
+                                    ("second", -3.0325462466767075),
+                                    ("integer (numeric)ann\233e (grain)", -3.16607763930123),
+                                    ("integer (numeric)seconde (grain)", -3.7256934272366524),
+                                    ("integer (numeric)jour (grain)", -3.16607763930123),
+                                    ("day", -2.5470384308950065), ("year", -2.627081138568543),
+                                    ("number (0..19)seconde (grain)", -3.5025498759224427),
+                                    ("number (0..19)ann\233e (grain)", -3.3202283191284883),
+                                    ("number (0..19)semaine (grain)", -4.013375499688434),
+                                    ("hour", -2.278774444300327),
+                                    ("number (0..19)mois (grain)", -3.0325462466767075),
+                                    ("month", -2.403937587254333),
+                                    ("integer (numeric)minute (grain)", -3.5025498759224427),
+                                    ("integer (numeric)mois (grain)", -3.0325462466767075),
+                                    ("minute", -3.0325462466767075),
+                                    ("number (0..19)minute (grain)", -3.7256934272366524),
+                                    ("integer (numeric)semaine (grain)", -3.7256934272366524),
+                                    ("integer (numeric)heure (grain)", -2.8094026953624978)],
+                               n = 72}}),
+       ("immacolata concezione",
+        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}}),
+       ("Lunedi",
+        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}}),
+       ("<dim time> al <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.3746934494414107,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.413693335308005),
+                                    ("<integer> (latent time-of-day)afternoon", -2.917770732084279),
+                                    ("hh(:|h)mm (time-of-day)afternoon", -2.917770732084279),
+                                    ("<day-of-month> <named-month>morning", -2.512305623976115),
+                                    ("il <day-of-month> <named-month>morning", -2.917770732084279),
+                                    ("hourhour", -2.917770732084279),
+                                    ("two time tokens in a rowmorning", -2.917770732084279),
+                                    ("minutehour", -2.512305623976115),
+                                    ("tomorrowevening", -2.917770732084279),
+                                    ("Lunedimorning", -2.512305623976115),
+                                    ("il <time>morning", -2.917770732084279),
+                                    ("hh(:|h)mm (time-of-day)morning", -2.917770732084279)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.1631508098056809, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.5257286443082556),
+                                    ("<integer> (latent time-of-day)afternoon", -2.120263536200091),
+                                    ("tomorrownight", -2.5257286443082556),
+                                    ("monthhour", -2.120263536200091),
+                                    ("hourhour", -2.120263536200091),
+                                    ("Febbraiomorning", -2.120263536200091)],
+                               n = 5}}),
+       ("Mercoledi",
+        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}}),
+       ("dal <datetime> al <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.6931471805599453),
+                                    ("tomorrowGiovedi", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dalle <time-of-day> alle <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight<integer> (latent time-of-day)", -2.3978952727983707),
+                                    ("minuteminute", -1.7047480922384253),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -1.7047480922384253),
+                                    ("<integer> (latent time-of-day)<integer> (latent time-of-day)",
+                                     -1.9924301646902063),
+                                    ("hourhour", -1.4816045409242156),
+                                    ("<integer> (latent time-of-day)una", -2.3978952727983707)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.2039728043259361, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minutehour", -1.252762968495368),
+                                    ("hh(:|h)mm (time-of-day)<integer> (latent time-of-day)",
+                                     -1.252762968495368)],
+                               n = 3}}),
+       ("ferragosto",
+        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 (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+        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 (1st)",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Sabato",
+        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}}),
+       ("Maggio",
+        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 (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.14058195062118944,
+                               unseen = -4.007333185232471,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 53},
+                   koData =
+                     ClassData{prior = -2.031432322493475, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("year (1000-2100 not latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.1670540846631662,
+                               unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -1.8718021769015913, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("il <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546, unseen = -4.060443010546419,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dd[/-]mm", -3.349904087274605),
+                                    ("Martedi", -3.349904087274605),
+                                    ("<ordinal> quarter", -3.349904087274605),
+                                    ("<cycle> next", -3.349904087274605),
+                                    ("<ordinal> <cycle> of <time>", -3.349904087274605),
+                                    ("<ordinal> quarter <year>", -3.349904087274605),
+                                    ("day", -1.3350010667323402), ("quarter", -2.9444389791664407),
+                                    ("<dim time> al <part-of-day>", -3.349904087274605),
+                                    ("day of month (1st)", -3.349904087274605),
+                                    ("two time tokens in a row", -2.6567569067146595),
+                                    ("hour", -2.9444389791664407), ("month", -3.349904087274605),
+                                    ("next <time>", -2.9444389791664407),
+                                    ("<day-of-month> <named-month>", -2.097141118779237),
+                                    ("minute", -3.349904087274605),
+                                    ("week-end", -3.349904087274605)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> quarter", -2.5257286443082556),
+                                    ("day", -2.5257286443082556), ("quarter", -2.5257286443082556),
+                                    ("two time tokens in a row", -2.5257286443082556),
+                                    ("hour", -2.120263536200091),
+                                    ("<day-of-month> <named-month>", -2.5257286443082556),
+                                    ("week-end", -2.5257286443082556)],
+                               n = 4}}),
+       ("entro <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.4423470353692043),
+                                    ("il <day-of-month>", -2.4423470353692043),
+                                    ("EOY|End of year", -2.4423470353692043),
+                                    ("day", -2.4423470353692043), ("year", -2.4423470353692043),
+                                    ("EOM|End of month", -2.4423470353692043),
+                                    ("noon", -2.4423470353692043), ("hour", -2.4423470353692043),
+                                    ("month", -2.03688192726104), ("Marzo", -2.4423470353692043),
+                                    ("minute", -2.4423470353692043)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.8718021769015913),
+                                    ("hour", -1.8718021769015913)],
+                               n = 1}}),
+       ("trimestre (grain)",
+        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}}),
+       ("Gennaio",
+        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}}),
+       ("ognissanti",
+        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}}),
+       ("<hour-of-day> minus <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noonnumber (0..19)", -1.0986122886681098),
+                                    ("at <time-of-day>number (0..19)", -1.5040773967762742),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("une <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("heure (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <cycle> ",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.7047480922384253),
+                                    ("ann\233e (grain)", -2.3978952727983707),
+                                    ("semaine (grain)", -1.7047480922384253),
+                                    ("mois (grain)", -2.3978952727983707),
+                                    ("quarter", -1.9924301646902063), ("year", -2.3978952727983707),
+                                    ("trimestre (grain)", -1.9924301646902063),
+                                    ("month", -2.3978952727983707)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("EOM|End of month",
+        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 quart del pomeriggio(time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("two time tokens in a row",
+        Classifier{okData =
+                     ClassData{prior = -0.3402001067352274, unseen = -6.021023349349527,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Lunedi<day-of-month> <named-month>", -4.919980925828125),
+                                    ("<datetime> - <datetime> (interval)Giovedi",
+                                     -5.32544603393629),
+                                    ("intersect by \"di\", \"della\", \"del\"year (1000-2100 not latent)",
+                                     -4.919980925828125),
+                                    ("dayhour", -3.3105430133940246),
+                                    ("Febbraioyear (1000-2100 not latent)", -5.32544603393629),
+                                    ("Settembreat <time-of-day>", -4.632298853376344),
+                                    ("daymonth", -2.552857311696508),
+                                    ("<named-day> <day-of-month>Settembre", -4.22683374526818),
+                                    ("day of month (1st)intersect by \"di\", \"della\", \"del\"",
+                                     -4.632298853376344),
+                                    ("Ottobreyear (1000-2100 not latent)", -4.072683065440922),
+                                    ("monthyear", -3.1853798704400185),
+                                    ("day of month (1st)two time tokens in a row",
+                                     -4.22683374526818),
+                                    ("<ordinal> <cycle> of <time>year (1000-2100 not latent)",
+                                     -5.32544603393629),
+                                    ("christmasyear (1000-2100 not latent)", -4.919980925828125),
+                                    ("<named-day> <day-of-month>two time tokens in a row",
+                                     -4.919980925828125),
+                                    ("tomorrowdopo <time>", -5.32544603393629),
+                                    ("Giovedidalle <time-of-day> alle <time-of-day> (interval)",
+                                     -4.919980925828125),
+                                    ("intersect by \"di\", \"della\", \"del\"<day-of-month> <named-month>",
+                                     -4.632298853376344),
+                                    ("two time tokens separated by `di`Settembre",
+                                     -4.632298853376344),
+                                    ("day of month (1st)Maggio", -5.32544603393629),
+                                    ("tra il <integer> e il <integer> (interval)Luglio",
+                                     -4.919980925828125),
+                                    ("day of month (1st)Mercoledi", -5.32544603393629),
+                                    ("dayday", -2.7604966764747525),
+                                    ("il <time>year (1000-2100 not latent)", -5.32544603393629),
+                                    ("Giovediat <time-of-day>", -5.32544603393629),
+                                    ("entro il <integer>Aprile", -5.32544603393629),
+                                    ("dayyear", -3.1853798704400185),
+                                    ("tomorrowdalle <time-of-day> alle <time-of-day> (interval)",
+                                     -5.32544603393629),
+                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
+                                     -4.919980925828125),
+                                    ("dd[/-]mmat <time-of-day>", -5.32544603393629),
+                                    ("dal <integer> al <integer> (interval)Luglio",
+                                     -4.919980925828125),
+                                    ("tomorrowdopo le <time-of-day>", -4.919980925828125),
+                                    ("monthminute", -4.632298853376344),
+                                    ("minutemonth", -3.821368637160015),
+                                    ("il <time>Marzo", -5.32544603393629),
+                                    ("<named-day> <day-of-month>Febbraio", -4.409155302062135),
+                                    ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
+                                     -5.32544603393629),
+                                    ("Settembreyear (1000-2100 not latent)", -4.919980925828125),
+                                    ("Mercoledi<day-of-month> <named-month>", -5.32544603393629),
+                                    ("il <day-of-month> <named-month>at <time-of-day>",
+                                     -5.32544603393629),
+                                    ("day of month (1st)Marzo", -4.919980925828125),
+                                    ("Sabato<day-of-month> <named-month>", -5.32544603393629),
+                                    ("il <day-of-month>Settembre", -5.32544603393629),
+                                    ("Venerdi<day-of-month> <named-month>", -4.409155302062135),
+                                    ("<day-of-month> <named-month>at <time-of-day>",
+                                     -4.632298853376344),
+                                    ("il <day-of-month> <named-month>year (1000-2100 not latent)",
+                                     -5.32544603393629),
+                                    ("two time tokens separated by `di`year (1000-2100 not latent)",
+                                     -4.919980925828125),
+                                    ("last <cycle> of <time>year (1000-2100 not latent)",
+                                     -4.632298853376344),
+                                    ("day of month (1st)two time tokens separated by `di`",
+                                     -4.632298853376344),
+                                    ("il <day-of-month>Febbraio", -4.409155302062135),
+                                    ("Gennaioyear (1000-2100 not latent)", -4.632298853376344),
+                                    ("the day after tomorrowat <time-of-day>", -4.919980925828125),
+                                    ("two time tokens in a rowyear (1000-2100 not latent)",
+                                     -4.632298853376344),
+                                    ("il <day-of-month>two time tokens in a row",
+                                     -4.919980925828125),
+                                    ("Giovedientro <time>", -5.32544603393629),
+                                    ("at <time-of-day>two time tokens in a row",
+                                     -4.919980925828125),
+                                    ("dayminute", -2.927550761137919),
+                                    ("Venerditwo time tokens in a row", -4.919980925828125),
+                                    ("two time tokens in a rowat <time-of-day>", -4.22683374526818),
+                                    ("minuteday", -3.1282214566000697),
+                                    ("two time tokens separated by `di`<day-of-month> <named-month>",
+                                     -4.632298853376344),
+                                    ("il <time>at <time-of-day>", -5.32544603393629),
+                                    ("Sabatoat <time-of-day>", -5.32544603393629),
+                                    ("intersect by \"di\", \"della\", \"del\"Settembre",
+                                     -4.632298853376344),
+                                    ("Domenica<day-of-month> <named-month>", -5.32544603393629),
+                                    ("last <day-of-week> of <time>year (1000-2100 not latent)",
+                                     -5.32544603393629),
+                                    ("immacolata concezioneat <time-of-day>", -5.32544603393629),
+                                    ("at <time-of-day><named-day> <day-of-month>",
+                                     -5.32544603393629),
+                                    ("day of month (1st)Martedi", -4.409155302062135),
+                                    ("at <time-of-day>Venerdi", -5.32544603393629),
+                                    ("weekyear", -4.919980925828125),
+                                    ("Giovedi<time> timezone", -5.32544603393629),
+                                    ("Gioveditra il <datetime> e il <datetime> (interval)",
+                                     -4.919980925828125),
+                                    ("two time tokens in a rowSettembre", -4.919980925828125),
+                                    ("tomorrowat <time-of-day>", -5.32544603393629),
+                                    ("two time tokens in a row<day-of-month> <named-month>",
+                                     -4.919980925828125),
+                                    ("Giovedientro le <time-of-day>", -5.32544603393629),
+                                    ("two time tokens in a rowin <named-month>",
+                                     -4.632298853376344),
+                                    ("Dicembreyear (1000-2100 not latent)", -4.632298853376344),
+                                    ("Marzoyear (1000-2100 not latent)", -5.32544603393629),
+                                    ("Martediin <named-month>", -4.632298853376344),
+                                    ("the day after tomorrowentro le <time-of-day>",
+                                     -5.32544603393629),
+                                    ("<day-of-month> <named-month>year (1000-2100 not latent)",
+                                     -4.919980925828125),
+                                    ("commemorazione dei defuntiat <time-of-day>",
+                                     -5.32544603393629),
+                                    ("il <day-of-month>Marzo", -5.32544603393629),
+                                    ("hh(:|h)mm (time-of-day)Venerdi", -5.32544603393629)],
+                               n = 153},
+                   koData =
+                     ClassData{prior = -1.2435036430825712, unseen = -5.438079308923196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>prossimi <unit-of-duration>",
+                                     -4.33510971488613),
+                                    ("intersect by \"di\", \"della\", \"del\"year (1000-2100 not latent)",
+                                     -4.047427642434349),
+                                    ("dayhour", -2.214846178686039),
+                                    ("Settembreat <time-of-day>", -3.8242840911201395),
+                                    ("daymonth", -4.740574822994295),
+                                    ("monthday", -4.33510971488613),
+                                    ("monthyear", -4.740574822994295),
+                                    ("Luglio<day-of-month> <named-month>", -4.740574822994295),
+                                    ("<named-day> <day-of-month>two time tokens in a row",
+                                     -4.047427642434349),
+                                    ("Giovedidalle <time-of-day> alle <time-of-day> (interval)",
+                                     -4.740574822994295),
+                                    ("monthhour", -3.6419625343261846),
+                                    ("hourmonth", -4.33510971488613),
+                                    ("dayday", -4.740574822994295),
+                                    ("Febbraiothis <part-of-day>", -4.33510971488613),
+                                    ("Giovediat <time-of-day>", -4.33510971488613),
+                                    ("tra il <datetime> e il <datetime> (interval)Luglio",
+                                     -4.33510971488613),
+                                    ("dayyear", -3.2364974262180204),
+                                    ("tomorrowdalle <time-of-day> alle <time-of-day> (interval)",
+                                     -4.740574822994295),
+                                    ("<hour-of-day> and <relative minutes>Luglio",
+                                     -4.740574822994295),
+                                    ("tomorrowstanotte", -4.740574822994295),
+                                    ("dd[/-]mmat <time-of-day>", -4.740574822994295),
+                                    ("il <day-of-month>Luglio", -4.740574822994295),
+                                    ("tomorrowdopo le <time-of-day>", -4.33510971488613),
+                                    ("monthminute", -4.740574822994295),
+                                    ("minutemonth", -4.740574822994295),
+                                    ("il <day-of-month> <named-month>at <time-of-day>",
+                                     -4.740574822994295),
+                                    ("dopo <time>at <time-of-day>", -4.740574822994295),
+                                    ("<day-of-month> <named-month>at <time-of-day>",
+                                     -3.8242840911201395),
+                                    ("weekmonth", -4.33510971488613),
+                                    ("two time tokens separated by `di`year (1000-2100 not latent)",
+                                     -4.047427642434349),
+                                    ("hourweek", -4.33510971488613),
+                                    ("the day after tomorrowat <time-of-day>", -4.740574822994295),
+                                    ("il <day-of-month>two time tokens in a row",
+                                     -4.740574822994295),
+                                    ("Agosto<day-of-month> <named-month>", -4.740574822994295),
+                                    ("dayminute", -2.9488153537662396),
+                                    ("Venerditwo time tokens in a row", -4.047427642434349),
+                                    ("two time tokens in a rowat <time-of-day>",
+                                     -3.3542804618744038),
+                                    ("minuteday", -4.740574822994295),
+                                    ("il <time>at <time-of-day>", -4.740574822994295),
+                                    ("Giovedidopo le <time-of-day>", -4.047427642434349),
+                                    ("the <cycle> of <time>Ottobre", -4.33510971488613),
+                                    ("Gioveditra il <datetime> e il <datetime> (interval)",
+                                     -4.740574822994295),
+                                    ("tomorrowat <time-of-day>", -4.740574822994295),
+                                    ("Martedidopo <time>", -4.740574822994295),
+                                    ("dopo <time>year (1000-2100 not latent)", -4.33510971488613),
+                                    ("hh(:|h)mm (time-of-day)Giovedi", -4.740574822994295),
+                                    ("Marzoyear (1000-2100 not latent)", -4.740574822994295)],
+                               n = 62}}),
+       ("heure (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the day after tomorrow",
+        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}}),
+       ("noon",
+        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}}),
+       ("jour (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}}),
+       ("hh <relative-minutes> del pomeriggio(time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>number (20..90)", -1.2992829841302609),
+                                    ("<integer> (latent time-of-day)number (20..90)",
+                                     -1.2992829841302609),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> minus quart",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.5040773967762742),
+                                    ("noon", -1.0986122886681098), ("hour", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("evening",
+        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}}),
+       ("dd[/-]mm[/-]yyyy",
+        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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martedi", -1.791759469228055),
+                                    ("season", -2.1972245773362196), ("day", -0.9444616088408514),
+                                    ("Lunedi", -2.1972245773362196),
+                                    ("Mercoledi", -2.1972245773362196),
+                                    ("il <time>", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martedi", -1.3862943611198906), ("day", -1.3862943611198906)],
+                               n = 1}}),
+       ("christmas",
+        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}}),
+       ("new year's day",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.304065093204169,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.498699971920336),
+                                    ("number (0..19)heure (grain)", -3.597312260588446),
+                                    ("number (0..19)jour (grain)", -3.597312260588446),
+                                    ("second", -2.9041650800285006),
+                                    ("integer (numeric)ann\233e (grain)", -3.597312260588446),
+                                    ("integer (numeric)seconde (grain)", -3.597312260588446),
+                                    ("integer (numeric)jour (grain)", -3.1918471524802814),
+                                    ("day", -2.9041650800285006), ("year", -2.9041650800285006),
+                                    ("number (0..19)seconde (grain)", -3.1918471524802814),
+                                    ("number (0..19)ann\233e (grain)", -3.1918471524802814),
+                                    ("number (0..19)semaine (grain)", -3.1918471524802814),
+                                    ("hour", -2.9041650800285006),
+                                    ("number (0..19)mois (grain)", -2.9041650800285006),
+                                    ("month", -2.344549292093078),
+                                    ("integer (numeric)minute (grain)", -3.1918471524802814),
+                                    ("integer (numeric)mois (grain)", -2.9041650800285006),
+                                    ("minute", -2.9041650800285006),
+                                    ("number (0..19)minute (grain)", -3.597312260588446),
+                                    ("integer (numeric)semaine (grain)", -2.9041650800285006),
+                                    ("integer (numeric)heure (grain)", -3.1918471524802814)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("entro il <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.9808292530117262),
+                                    ("semaine (grain)", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mois (grain)", -0.9808292530117262),
+                                    ("month", -0.9808292530117262)],
+                               n = 2}}),
+       ("prossimi <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9924301646902063),
+                                    ("ann\233e (grain)", -2.3978952727983707),
+                                    ("semaine (grain)", -1.9924301646902063),
+                                    ("mois (grain)", -1.9924301646902063),
+                                    ("day", -1.9924301646902063), ("year", -2.3978952727983707),
+                                    ("jour (grain)", -1.9924301646902063),
+                                    ("month", -1.9924301646902063)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dopo <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.9555114450274363, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.845826690498331),
+                                    ("Giovedi", -2.2512917986064953), ("day", -1.55814461804655),
+                                    ("day of month (1st)", -2.2512917986064953),
+                                    ("the day after tomorrow", -2.2512917986064953),
+                                    ("hour", -1.845826690498331)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.48550781578170077,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tomorrow", -1.8325814637483102), ("day", -1.1394342831883648),
+                                    ("two time tokens in a row", -1.8325814637483102),
+                                    ("hour", -2.5257286443082556),
+                                    ("christmas", -2.120263536200091)],
+                               n = 8}}),
+       ("festa della liberazione",
+        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}}),
+       ("dal <integer",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -0.40546510810816444)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.6931471805599453),
+                                    ("number (0..19)", -0.6931471805599453)],
+                               n = 4}}),
+       ("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}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.5040773967762742),
+                                    ("<day-of-month> <named-month><day-of-month> <named-month>",
+                                     -1.791759469228055),
+                                    ("hh(:|h)mm (time-of-day)hh(:|h)mm (time-of-day)",
+                                     -1.5040773967762742),
+                                    ("dayday", -1.791759469228055)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.540445040947149),
+                                    ("Luglio<day-of-month> <named-month>", -1.9459101490553135),
+                                    ("minuteminute", -1.9459101490553135),
+                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
+                                     -1.9459101490553135),
+                                    ("Agosto<day-of-month> <named-month>", -1.9459101490553135)],
+                               n = 3}}),
+       ("<day-of-month> <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.1880522315029396, unseen = -4.219507705176107,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Settembre", -2.12525107771113),
+                                    ("integer (numeric)Aprile", -3.5115454388310208),
+                                    ("integer (numeric)Agosto", -3.1060803307228566),
+                                    ("integer (numeric)Ottobre", -3.1060803307228566),
+                                    ("integer (numeric)Marzo", -3.1060803307228566),
+                                    ("integer (numeric)Febbraio", -1.5656352897757075),
+                                    ("integer (numeric)Luglio", -3.1060803307228566),
+                                    ("month", -0.8034952377288106)],
+                               n = 29},
+                   koData =
+                     ClassData{prior = -1.7635885922613588,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Aprile", -2.3513752571634776),
+                                    ("integer (numeric)Luglio", -1.4350845252893227),
+                                    ("month", -1.0986122886681098),
+                                    ("number (0..19)Luglio", -2.3513752571634776)],
+                               n = 6}}),
+       ("Marzo",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("in <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Ottobre", -1.0116009116784799),
+                                    ("month", -0.7884573603642702), ("Marzo", -1.7047480922384253)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mezz'ora",
+        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}}),
+       ("Dicembre",
+        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}}),
+       ("<time> entro le <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.8472978603872037),
+                                    ("Giovedinoon", -1.252762968495368),
+                                    ("the day after tomorrow<integer> (latent time-of-day)",
+                                     -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               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 (primo..10)Marteditwo time tokens in a row",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (primo..10)Martedichristmas", -0.916290731874155)],
+                               n = 1}}),
+       ("<part-of-day> of <dim time>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -1.0986122886681098),
+                                    ("morning<day-of-month> <named-month>", -1.6094379124341003),
+                                    ("eveningtomorrow", -2.0149030205422647),
+                                    ("morningLunedi", -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.5108256237659907, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -0.9985288301111273),
+                                    ("stanottetomorrow", -1.845826690498331),
+                                    ("nighttomorrow", -1.845826690498331),
+                                    ("afternoontomorrow", -1.845826690498331)],
+                               n = 6}}),
+       ("<dim time> del mattino",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.7047480922384253),
+                                    ("<integer> (latent time-of-day)", -1.7047480922384253),
+                                    ("hh(:|h)mm (time-of-day)", -1.7047480922384253),
+                                    ("hour", -1.2992829841302609), ("minute", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.2809338454620642),
+                                    ("jour (grain)two time tokens in a row", -1.791759469228055),
+                                    ("semaine (grain)Settembre", -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("semaine (grain)two time tokens in a row",
+                                     -2.1972245773362196),
+                                    ("jour (grain)Ottobre", -1.791759469228055)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("two time tokens separated by `di`",
+        Classifier{okData =
+                     ClassData{prior = -0.4274440148269396, unseen = -4.543294782270004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh(:|h)mm (time-of-day)Sabato", -3.8394523125933104),
+                                    ("hourday", -2.5866893440979424),
+                                    ("daymonth", -2.45315795147342),
+                                    ("MartediOttobre", -3.8394523125933104),
+                                    ("Mercoleditwo time tokens in a row", -3.8394523125933104),
+                                    ("two time tokens in a rowtwo time tokens in a row",
+                                     -3.8394523125933104),
+                                    ("two time tokens in a rowOttobre", -3.4339872044851463),
+                                    ("<integer 0 12> del <part of day>tomorrow",
+                                     -3.8394523125933104),
+                                    ("hh(:|h)mm (time-of-day)two time tokens in a row",
+                                     -2.9231615807191553),
+                                    ("Lunedithis <cycle>", -3.8394523125933104),
+                                    ("Martedithis <cycle>", -3.8394523125933104),
+                                    ("hh(:|h)mm (time-of-day)<named-day> <day-of-month>",
+                                     -3.4339872044851463),
+                                    ("day of month (1st)Marzo", -3.8394523125933104),
+                                    ("MercolediOttobre", -3.8394523125933104),
+                                    ("at <time-of-day>two time tokens in a row",
+                                     -3.4339872044851463),
+                                    ("minuteday", -1.824549292051046),
+                                    ("dalle <time-of-day> alle <time-of-day> (interval)Giovedi",
+                                     -3.146305132033365),
+                                    ("at <time-of-day>Sabato", -3.8394523125933104),
+                                    ("at <time-of-day><named-day> <day-of-month>",
+                                     -3.8394523125933104),
+                                    ("dayweek", -3.146305132033365),
+                                    ("at <time-of-day>Venerdi", -3.8394523125933104),
+                                    ("tra il <datetime> e il <datetime> (interval)Giovedi",
+                                     -3.4339872044851463),
+                                    ("<dim time> al <part-of-day>tomorrow", -3.8394523125933104),
+                                    ("Mercoledithis <cycle>", -3.8394523125933104),
+                                    ("hh(:|h)mm (time-of-day)Venerdi", -3.8394523125933104)],
+                               n = 30},
+                   koData =
+                     ClassData{prior = -1.0560526742493137, unseen = -4.189654742026425,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.382627800667582),
+                                    ("daymonth", -2.094945728215801),
+                                    ("Mercoleditwo time tokens in a row", -3.481240089335692),
+                                    ("stanottetomorrow", -3.0757749812275272),
+                                    ("MartediSettembre", -3.481240089335692),
+                                    ("LunediMarzo", -3.481240089335692),
+                                    ("MercolediOttobre", -3.481240089335692),
+                                    ("Marteditwo time tokens in a row", -3.481240089335692),
+                                    ("minuteday", -2.5649493574615367),
+                                    ("DomenicaMarzo", -3.481240089335692),
+                                    ("at <time-of-day>Giovedi", -2.382627800667582),
+                                    ("Domenicatwo time tokens in a row", -3.481240089335692),
+                                    ("hh(:|h)mm (time-of-day)Giovedi", -3.0757749812275272)],
+                               n = 16}}),
+       ("il <day-of-month> <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Settembre", -2.1400661634962708),
+                                    ("integer (numeric)Marzo", -2.1400661634962708),
+                                    ("integer (numeric)Febbraio", -1.2237754316221157),
+                                    ("month", -0.8873031950009028)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)Luglio", -1.252762968495368),
+                                    ("month", -1.252762968495368)],
+                               n = 1}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("fino al <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh(:|h)mm (time-of-day)", -1.791759469228055),
+                                    ("EOY|End of year", -1.791759469228055),
+                                    ("year", -1.791759469228055),
+                                    ("EOM|End of month", -1.791759469228055),
+                                    ("month", -1.791759469228055), ("minute", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("right now",
+        Classifier{okData =
+                     ClassData{prior = -0.8754687373538999,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.5389965007326869,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("Domenica",
+        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}}),
+       ("tre quarti d'ora",
+        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 <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("ann\233e (grain)", -2.1972245773362196),
+                                    ("semaine (grain)", -1.791759469228055),
+                                    ("mois (grain)", -1.5040773967762742),
+                                    ("year", -2.1972245773362196), ("month", -1.5040773967762742)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("festa del pap\224",
+        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}}),
+       ("<hour-of-day> <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("at <time-of-day>integer (numeric)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Luglio", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8971199848858813),
+                                    ("semaine (grain)", -1.8971199848858813),
+                                    ("mois (grain)", -1.8971199848858813),
+                                    ("heure (grain)", -1.8971199848858813),
+                                    ("hour", -1.8971199848858813), ("month", -1.8971199848858813)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9459101490553135),
+                                    ("semaine (grain)", -1.9459101490553135),
+                                    ("day", -1.540445040947149),
+                                    ("jour (grain)", -1.540445040947149)],
+                               n = 3}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("season", -1.8562979903656263), ("day", -1.8562979903656263),
+                                    ("hour", -1.1631508098056809), ("evening", -2.772588722239781),
+                                    ("morning", -2.0794415416798357),
+                                    ("week-end", -1.6739764335716716)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/JA.hs b/Duckling/Ranking/Classifiers/JA.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/JA.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.JA (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/JA_XX.hs b/Duckling/Ranking/Classifiers/JA_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/JA_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.JA_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/KA_XX.hs b/Duckling/Ranking/Classifiers/KA_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/KA_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.KA_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/KO.hs b/Duckling/Ranking/Classifiers/KO.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/KO.hs
+++ /dev/null
@@ -1,1458 +0,0 @@
--- 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.KO (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> am|pm", -1.3862943611198906),
-                                    ("hh:mm", -1.3862943611198906), ("hour", -1.3862943611198906),
-                                    ("minute", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.4267425065554492, unseen = -4.836281906951478,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 124},
-                   koData =
-                     ClassData{prior = -1.0573693301340605, unseen = -4.219507705176107,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 66}}),
-       ("lunch",
-        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 2 numbers",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("compose by multiplicationinteger (21..99) - TYPE 2",
-                                     -0.40546510810816444)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer - TYPE 1: powers of teninteger (21..99) - TYPE 2",
-                                     -0.40546510810816444)],
-                               n = 1}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037, unseen = -4.143134726391533,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.1826954058786512),
-                                    ("day-of-weekmorning", -3.4339872044851463),
-                                    ("yesterdayevening|night", -3.4339872044851463),
-                                    ("mm/ddafternoon", -3.4339872044851463),
-                                    ("todayafternoon", -3.4339872044851463),
-                                    ("dayevening|night", -3.4339872044851463),
-                                    ("todayevening|night", -2.740840023925201),
-                                    ("daymorning", -3.4339872044851463),
-                                    ("intersectevening|night", -3.4339872044851463),
-                                    ("next <cycle>evening|night", -3.028522096376982),
-                                    ("tomorrowlunch", -3.4339872044851463),
-                                    ("intersectmorning", -3.4339872044851463),
-                                    ("the day before yesterday - \50634\44536\51228morning",
-                                     -3.4339872044851463),
-                                    ("tomorrowevening|night", -3.028522096376982),
-                                    ("next <cycle>lunch", -3.4339872044851463)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -0.5596157879354228, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)lunch", -3.6109179126442243),
-                                    ("dayhour", -1.8191584434161694),
-                                    ("yearhour", -1.906169820405799),
-                                    ("time-of-day (latent)evening|night", -3.6109179126442243),
-                                    ("year (latent)evening|night", -2.512305623976115),
-                                    ("hourhour", -2.917770732084279),
-                                    ("time-of-day (latent)lunch", -3.6109179126442243),
-                                    ("intersectafternoon", -2.10684051586795),
-                                    ("year (latent)afternoon", -3.20545280453606),
-                                    ("day-of-weekafternoon", -3.6109179126442243),
-                                    ("next <cycle>evening|night", -3.6109179126442243),
-                                    ("time-of-day (latent)afternoon", -3.6109179126442243),
-                                    ("year (latent)morning", -3.20545280453606),
-                                    ("tomorrowevening|night", -3.6109179126442243)],
-                               n = 24}}),
-       ("<time> nth <time> - 3\50900 \52395\51704 \54868\50836\51068",
-        Classifier{okData =
-                     ClassData{prior = -0.6190392084062235, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -0.7537718023763802),
-                                    ("intersectordinals (\52395\48264\51704)day-of-week",
-                                     -0.8873031950009028),
-                                    ("monthordinals (\52395\48264\51704)day-of-week",
-                                     -2.1400661634962708)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -0.7731898882334817, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -0.7621400520468967),
-                                    ("monthordinals (\52395\48264\51704)day-of-week",
-                                     -0.7621400520468967)],
-                               n = 6}}),
-       ("the day before yesterday - \50634\44536\51228",
-        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}}),
-       ("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 = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half - \48152",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("month (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}}),
-       ("<time> \47560\51648\47561 <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersectday-of-week", -1.5040773967762742),
-                                    ("monthday", -0.8109302162163288),
-                                    ("monthday-of-week", -1.0986122886681098)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer - TYPE 1",
-        Classifier{okData =
-                     ClassData{prior = -1.8523840910444898, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -0.17062551703076334,
-                               unseen = -4.875197323201151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 129}}),
-       ("fraction",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6359887667199967),
-                                    ("fractioninteger (numeric)", -1.4469189829363254),
-                                    ("integer (numeric)fraction", -1.4469189829363254)],
-                               n = 14}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -1.241713132308783, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -0.3409265869705932,
-                               unseen = -3.5263605246161616,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 32}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.45983651189029134,
-                               unseen = -5.958424693029782,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect<hour-of-day> <integer> (as relative minutes)",
-                                     -5.262690188904886),
-                                    ("intersectday-of-week", -4.164077900236776),
-                                    ("year<time> \47560\51648\47561 <cycle>", -4.857225080796721),
-                                    ("next <cycle>day-of-week", -4.3463994570307305),
-                                    ("dayhour", -2.0240117367405053),
-                                    ("monthday", -2.4294768448486694),
-                                    ("yearhour", -3.5579420966664603),
-                                    ("<time> <part-of-day>time-of-day", -4.3463994570307305),
-                                    ("intersectam|pm <time-of-day>", -3.065465611568666),
-                                    ("next <cycle><time-of-day> am|pm", -5.262690188904886),
-                                    ("next <cycle>am|pm <time-of-day>", -4.857225080796721),
-                                    ("yearintersect", -2.96010509591084),
-                                    ("day-of-week<datetime> - <datetime> (interval)",
-                                     -4.3463994570307305),
-                                    ("day-of-week<time-of-day> - <time-of-day> (interval)",
-                                     -4.3463994570307305),
-                                    ("monthday with korean number - \51068\51068..\44396\51068",
-                                     -5.262690188904886),
-                                    ("dayday-of-week", -4.3463994570307305),
-                                    ("this <cycle>day-of-week", -4.857225080796721),
-                                    ("day-of-week<time> timezone", -5.262690188904886),
-                                    ("monthhour", -3.5579420966664603),
-                                    ("mm/ddam|pm <time-of-day>", -4.56954300834494),
-                                    ("todayam|pm <time-of-day>", -4.56954300834494),
-                                    ("the day before yesterday - \50634\44536\51228am|pm <time-of-day>",
-                                     -4.3463994570307305),
-                                    ("dayday", -3.653252276470785),
-                                    ("hourhour", -3.7586127921286114),
-                                    ("year<time> <ordinal> <cycle>", -5.262690188904886),
-                                    ("month<datetime> - <datetime> (interval)", -4.857225080796721),
-                                    ("dayam|pm <time-of-day>", -5.262690188904886),
-                                    ("day-of-weekam|pm <time-of-day>", -4.56954300834494),
-                                    ("time-of-dayafter <time-of-day>", -5.262690188904886),
-                                    ("monthminute", -4.857225080796721),
-                                    ("hourminute", -4.56954300834494),
-                                    ("intersectday", -4.164077900236776),
-                                    ("am|pm <time-of-day>after <time-of-day>", -5.262690188904886),
-                                    ("last <cycle>day-of-week", -4.56954300834494),
-                                    ("month<time> <part-of-day>", -4.857225080796721),
-                                    ("yearmonth", -3.122624025408615),
-                                    ("dayminute", -3.653252276470785),
-                                    ("today<date>\50640", -5.262690188904886),
-                                    ("mm/dd<date>\50640", -5.262690188904886),
-                                    ("<hour-of-day> <integer> (as relative minutes)seconds",
-                                     -5.262690188904886),
-                                    ("<time> <part-of-day><date>\50640", -4.857225080796721),
-                                    ("monthintersect", -3.653252276470785),
-                                    ("year<time> \47560\51648\47561 <day-of-week>",
-                                     -5.262690188904886),
-                                    ("intersectintersect", -3.4709307196768306),
-                                    ("weekday", -3.653252276470785),
-                                    ("intersectday with korean number - \51068\51068..\44396\51068",
-                                     -4.857225080796721),
-                                    ("yearday", -3.4709307196768306),
-                                    ("day-of-weekhh:mm", -4.857225080796721),
-                                    ("yearweek", -4.857225080796721),
-                                    ("minutesecond", -5.262690188904886),
-                                    ("<time> <part-of-day><hour-of-day> <integer> (as relative minutes)",
-                                     -4.857225080796721),
-                                    ("tomorrow<time-of-day> am|pm", -5.262690188904886),
-                                    ("tomorrowam|pm <time-of-day>", -4.857225080796721),
-                                    ("dayintersect", -4.857225080796721),
-                                    ("day-of-weektime-of-day", -5.262690188904886)],
-                               n = 173},
-                   koData =
-                     ClassData{prior = -0.9980075895468108, unseen = -5.616771097666572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year<time> \47560\51648\47561 <cycle>", -4.919980925828125),
-                                    ("day-of-weekintersect", -4.919980925828125),
-                                    ("dayhour", -2.2809235962128662),
-                                    ("daymonth", -4.5145158177199605),
-                                    ("monthday", -3.1282214566000697),
-                                    ("yearhour", -3.2152328335897),
-                                    ("<time> <part-of-day>time-of-day", -3.821368637160015),
-                                    ("houryear", -4.22683374526818),
-                                    ("day-of-weekafter <time-of-day>", -4.919980925828125),
-                                    ("after <time-of-day>by <time> - \44620\51648",
-                                     -4.919980925828125),
-                                    ("intersectam|pm <time-of-day>", -4.5145158177199605),
-                                    ("intersect<time> <part-of-day>", -4.00369019395397),
-                                    ("yearintersect", -3.0481787489265337),
-                                    ("day-of-week<time-of-day> - <time-of-day> (interval)",
-                                     -4.00369019395397),
-                                    ("intersectmonth", -4.919980925828125),
-                                    ("time-of-day<duration> ago", -4.919980925828125),
-                                    ("this <cycle>day-of-week", -4.5145158177199605),
-                                    ("intersecttime-of-day", -4.5145158177199605),
-                                    ("monthhour", -3.0481787489265337),
-                                    ("intersectlast <time>", -4.919980925828125),
-                                    ("dayday", -4.00369019395397),
-                                    ("hourhour", -2.9740707767728116),
-                                    ("month<datetime> - <datetime> (interval)", -4.00369019395397),
-                                    ("dayam|pm <time-of-day>", -4.5145158177199605),
-                                    ("day-of-weekam|pm <time-of-day>", -4.919980925828125),
-                                    ("hourminute", -4.22683374526818),
-                                    ("<time-of-day> - <time-of-day> (interval)last <time>",
-                                     -4.00369019395397),
-                                    ("intersectday", -4.5145158177199605),
-                                    ("<datetime> - <datetime> (interval)day", -4.00369019395397),
-                                    ("month<time> <part-of-day>", -4.5145158177199605),
-                                    ("yearmonth", -4.5145158177199605),
-                                    ("dayminute", -4.22683374526818),
-                                    ("<hour-of-day> <integer> (as relative minutes)seconds",
-                                     -4.22683374526818),
-                                    ("<time> <part-of-day><date>\50640", -4.919980925828125),
-                                    ("last <time>time-of-day", -4.919980925828125),
-                                    ("monthintersect", -3.3105430133940246),
-                                    ("hoursecond", -4.919980925828125),
-                                    ("year<time> <part-of-day>", -4.5145158177199605),
-                                    ("intersectintersect", -3.667217957332757),
-                                    ("weekday", -4.5145158177199605),
-                                    ("intersectday with korean number - \51068\51068..\44396\51068",
-                                     -4.5145158177199605),
-                                    ("day<time> <part-of-day>", -4.919980925828125),
-                                    ("yearday", -3.821368637160015),
-                                    ("day-of-weekhh:mm", -4.919980925828125),
-                                    ("<time-of-day> - <time-of-day> (interval)time-of-day",
-                                     -4.5145158177199605),
-                                    ("intersectafter <time-of-day>", -3.415903529051851),
-                                    ("minutesecond", -4.22683374526818),
-                                    ("<time> <part-of-day><hour-of-day> <integer> (as relative minutes)",
-                                     -4.5145158177199605),
-                                    ("dayintersect", -4.919980925828125),
-                                    ("mm/ddafter <time-of-day>", -4.919980925828125),
-                                    ("todayafter <time-of-day>", -4.919980925828125)],
-                               n = 101}}),
-       ("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}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = -1.0608719606852628,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -0.42488319396526597,
-                               unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.12516314295400605,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("month (grain)", -3.044522437723423),
-                                    ("year (grain)", -3.044522437723423),
-                                    ("week (grain)", -1.791759469228055),
-                                    ("day", -1.791759469228055), ("quarter", -3.044522437723423),
-                                    ("year", -3.044522437723423), ("month", -3.044522437723423),
-                                    ("quarter (grain)", -3.044522437723423),
-                                    ("day (grain)", -1.791759469228055)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -2.1400661634962708, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -2.0794415416798357),
-                                    ("minute (grain)", -2.0794415416798357),
-                                    ("minute", -2.0794415416798357),
-                                    ("day (grain)", -2.0794415416798357)],
-                               n = 2}}),
-       ("this <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("day-of-week", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               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 = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.9315582040049435),
-                                    ("integer - TYPE 1", -0.8574502318512216),
-                                    ("integer (21..99) - TYPE 2", -2.803360380906535),
-                                    ("integer (1..4) - for ordinals", -2.1102132003465894)],
-                               n = 29}}),
-       ("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}}),
-       ("evening|night",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Memorial 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}}),
-       ("yesterday",
-        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 (20..90) - TYPE 2 and ordinals",
-        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}}),
-       ("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}}),
-       ("by <time> - \44620\51648",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("am|pm <time-of-day>", -1.252762968495368),
-                                    ("time-of-day", -1.252762968495368),
-                                    ("hour", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>\50640",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("month", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (21..99) - TYPE 2",
-        Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (20..90) - TYPE 2 and ordinalsinteger (1..4) - for ordinals",
-                                     -1.6094379124341003),
-                                    ("integer - TYPE 1: powers of teninteger - TYPE 1",
-                                     -1.2039728043259361),
-                                    ("compose by multiplicationinteger - TYPE 1",
-                                     -1.2039728043259361)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.8109302162163288,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -1.5040773967762742),
-                                    ("integer - TYPE 1: powers of teninteger - TYPE 1",
-                                     -1.0986122886681098),
-                                    ("integer (numeric)integer - TYPE 1", -1.5040773967762742)],
-                               n = 4}}),
-       ("Independence Movement 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}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.17589066646366416,
-                               unseen = -3.332204510175204,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
-                   koData =
-                     ClassData{prior = -1.824549292051046, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("<year> <1..4>quarter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearinteger (numeric)quarter (grain)", -0.6931471805599453),
-                                    ("yearquarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("christmas 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}}),
-       ("Liberation 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}}),
-       ("numbers prefix with -, \47560\51060\45320\49828, or \47560\51060\45208\49828",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 7}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("afternoon", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tomorrow",
-        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}}),
-       ("National Foundation 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}}),
-       ("ordinals (\52395\48264\51704)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (1..4) - for ordinals", -0.35667494393873245),
-                                    ("integer (1..10) - TYPE 2", -1.2039728043259361)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day",
-        Classifier{okData =
-                     ClassData{prior = -0.2657031657330056, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -8.338160893905101e-2),
-                                    ("integer - TYPE 1", -2.5257286443082556)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -1.455287232606842, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.25131442828090605),
-                                    ("integer - TYPE 1", -1.5040773967762742)],
-                               n = 7}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 7}}),
-       ("afternoon",
-        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}}),
-       ("integer (1..4) - for ordinals",
-        Classifier{okData =
-                     ClassData{prior = -3.7740327982847086e-2,
-                               unseen = -3.332204510175204,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
-                   koData =
-                     ClassData{prior = -3.295836866004329, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<time> <ordinal> <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthordinals (\52395\48264\51704)week (grain)",
-                                     -1.252762968495368),
-                                    ("monthweek", -0.8472978603872037),
-                                    ("intersectordinals (\52395\48264\51704)week (grain)",
-                                     -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("year (grain)", -2.3025850929940455),
-                                    ("week (grain)", -1.3862943611198906),
-                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
-                                    ("quarter (grain)", -2.3025850929940455)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("week (grain)", -1.3862943611198906),
-                                    ("minute (grain)", -2.0794415416798357),
-                                    ("minute", -2.0794415416798357)],
-                               n = 4}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.6359887667199967,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -0.7537718023763802,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.252762968495368),
-                                    ("time-of-day", -1.252762968495368),
-                                    ("hour", -0.8472978603872037)],
-                               n = 2}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -1.3596261140377293, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.6567795363890705),
-                                    ("integer - TYPE 1", -2.6026896854443837),
-                                    ("integer (1..4) - for ordinals", -1.6863989535702288),
-                                    ("integer (1..10) - TYPE 2", -2.6026896854443837)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -0.2967319079716989,
-                               unseen = -4.1588830833596715,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.052092273033217),
-                                    ("integer - TYPE 1", -0.924258901523332),
-                                    ("integer (20..90) - TYPE 2 and ordinals", -3.4499875458315876),
-                                    ("integer (21..99) - TYPE 2", -3.4499875458315876),
-                                    ("integer (1..4) - for ordinals", -2.3513752571634776),
-                                    ("integer - TYPE 1: powers of ten", -3.044522437723423),
-                                    ("compose by multiplication", -3.4499875458315876)],
-                               n = 55}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -1.006804739414987, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3677247801253174),
-                                    ("intersect 2 numbers", -2.5649493574615367),
-                                    ("integer (21..99) - TYPE 2", -2.5649493574615367)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -0.4547361571149472, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.5533852381847867),
-                                    ("intersect 2 numbers", -2.3025850929940455),
-                                    ("integer - TYPE 1", -2.0794415416798357),
-                                    ("fraction", -2.995732273553991),
-                                    ("integer - TYPE 1: powers of ten", -2.5902671654458267),
-                                    ("compose by multiplication", -2.995732273553991)],
-                               n = 33}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -1.5955488002734333,
-                               unseen = -4.5217885770490405,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.7191000372887952),
-                                    ("integer - TYPE 1year (grain)", -3.41224721784874),
-                                    ("integer (numeric)day (grain)", -2.5649493574615367),
-                                    ("second", -3.817712325956905),
-                                    ("integer - TYPE 1minute (grain)", -2.9014215940827497),
-                                    ("integer (1..4) - for ordinalshour (grain)",
-                                     -3.41224721784874),
-                                    ("integer (numeric)second (grain)", -3.817712325956905),
-                                    ("integer (numeric)year (grain)", -3.41224721784874),
-                                    ("day", -2.5649493574615367), ("year", -2.9014215940827497),
-                                    ("integer (numeric)week (grain)", -2.7191000372887952),
-                                    ("hour", -2.3136349291806306),
-                                    ("integer (numeric)minute (grain)", -3.817712325956905),
-                                    ("few \47751hour (grain)", -2.9014215940827497),
-                                    ("minute", -2.7191000372887952),
-                                    ("integer (numeric)hour (grain)", -3.41224721784874)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -0.22664618186541183,
-                               unseen = -5.568344503761097,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.955082494888593),
-                                    ("integer - TYPE 1quarter (grain)", -4.871373226762748),
-                                    ("integer - TYPE 1day (grain)", -4.178226046202803),
-                                    ("integer - TYPE 1year (grain)", -4.465908118654584),
-                                    ("integer (numeric)day (grain)", -2.4290261913935436),
-                                    ("intersect 2 numbersyear (grain)", -4.465908118654584),
-                                    ("integer (numeric)quarter (grain)", -4.871373226762748),
-                                    ("compose by multiplicationminute (grain)", -4.871373226762748),
-                                    ("second", -3.7727609380946383),
-                                    ("integer - TYPE 1minute (grain)", -3.7727609380946383),
-                                    ("integer (1..4) - for ordinalsmonth (grain)",
-                                     -4.465908118654584),
-                                    ("integer (1..4) - for ordinalshour (grain)",
-                                     -2.7313070632664775),
-                                    ("integer (numeric)second (grain)", -4.871373226762748),
-                                    ("integer (numeric)year (grain)", -2.6741486494265287),
-                                    ("integer (21..99) - TYPE 2hour (grain)", -4.871373226762748),
-                                    ("integer - TYPE 1week (grain)", -4.465908118654584),
-                                    ("day", -2.3064238693012116), ("quarter", -4.465908118654584),
-                                    ("year", -2.4290261913935436),
-                                    ("integer (21..99) - TYPE 2minute (grain)", -4.178226046202803),
-                                    ("integer (numeric)week (grain)", -4.465908118654584),
-                                    ("integer (1..10) - TYPE 2hour (grain)", -4.871373226762748),
-                                    ("hour", -1.900958761193047), ("month", -3.955082494888593),
-                                    ("integer - TYPE 1second (grain)", -4.465908118654584),
-                                    ("integer (numeric)minute (grain)", -3.955082494888593),
-                                    ("integer (numeric)month (grain)", -4.465908118654584),
-                                    ("integer (21..99) - TYPE 2year (grain)", -4.871373226762748),
-                                    ("minute", -2.856470206220483),
-                                    ("integer - TYPE 1: powers of tenminute (grain)",
-                                     -4.871373226762748),
-                                    ("integer (numeric)hour (grain)", -2.5199979695992702),
-                                    ("integer (21..99) - TYPE 2second (grain)",
-                                     -4.465908118654584)],
-                               n = 114}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.3746934494414107, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.6486586255873816),
-                                    ("hh:mm", -1.1786549963416462), ("hour", -1.6486586255873816),
-                                    ("minute", -1.1786549963416462)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.1631508098056809, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.8472978603872037),
-                                    ("hour", -0.8472978603872037)],
-                               n = 5}}),
-       ("a day - \54616\47336",
-        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}}),
-       ("am|pm <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.23262229526875347,
-                               unseen = -4.543294782270004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.824549292051046),
-                                    ("<date>\50640", -3.146305132033365),
-                                    ("time-of-day", -1.536867219599265),
-                                    ("hour", -0.8437200390393196),
-                                    ("<time-of-day>\51060\51204", -3.4339872044851463),
-                                    ("<hour-of-day> half (as relative minutes)",
-                                     -3.8394523125933104),
-                                    ("minute", -3.146305132033365),
-                                    ("after <time-of-day>", -3.8394523125933104),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -3.4339872044851463)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -1.5723966407537513,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2367626271489267),
-                                    ("time-of-day", -2.0476928433652555),
-                                    ("hour", -0.9490805546971459)],
-                               n = 11}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -4.445176257083381e-2,
-                               unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
-                   koData =
-                     ClassData{prior = -3.1354942159291497,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("integer - TYPE 1: powers of ten",
-        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 with korean number - \51068\51068..\44396\51068",
-        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}}),
-       ("second (grain)",
-        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}}),
-       ("Hangul 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}}),
-       ("<integer> (hour-of-day) relative minutes \51204",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("time-of-dayinteger (21..99) - TYPE 2", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer - TYPE 1", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.8971199848858813), ("day", -1.6094379124341003),
-                                    ("year", -1.8971199848858813),
-                                    ("<integer> <unit-of-duration>", -0.916290731874155)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.0116009116784799, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>", -1.0296194171811581),
-                                    ("hour", -1.540445040947149), ("minute", -1.540445040947149)],
-                               n = 4}}),
-       ("Constitution 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}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -2.833213344056216, unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -2.03688192726104), ("hour", -2.03688192726104),
-                                    ("week-end", -2.03688192726104),
-                                    ("day-of-week", -2.03688192726104)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -6.0624621816434854e-2,
-                               unseen = -4.969813299576001,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -3.8642323415917974),
-                                    ("year (latent)", -1.967112356705916),
-                                    ("second", -3.8642323415917974),
-                                    ("time-of-day (latent)", -1.9183221925364844),
-                                    ("year", -1.967112356705916),
-                                    ("<duration> ago", -3.8642323415917974),
-                                    ("time-of-day", -2.477937980471907),
-                                    ("hour", -1.1786549963416462), ("seconds", -3.8642323415917974),
-                                    ("<datetime> - <datetime> (interval)", -3.8642323415917974),
-                                    ("<time-of-day>\51060\51204", -3.8642323415917974),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -3.353406717825807)],
-                               n = 64}}),
-       ("<date>\50640",
-        Classifier{okData =
-                     ClassData{prior = -7.410797215372185e-2,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.824549292051046), ("day", -2.3353749158170367),
-                                    ("am|pm <time-of-day>", -2.0476928433652555),
-                                    ("<duration> ago", -2.740840023925201),
-                                    ("time-of-day", -2.0476928433652555),
-                                    ("hour", -1.0360919316867756), ("month", -2.740840023925201)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -2.639057329615259, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.5040773967762742),
-                                    ("hour", -1.5040773967762742)],
-                               n = 1}}),
-       ("integer (1..10) - TYPE 2",
-        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}}),
-       ("time-of-day",
-        Classifier{okData =
-                     ClassData{prior = -0.5328045304847658,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.5753641449035618),
-                                    ("integer (1..4) - for ordinals", -1.1631508098056809),
-                                    ("integer (1..10) - TYPE 2", -2.772588722239781)],
-                               n = 27},
-                   koData =
-                     ClassData{prior = -0.8842024173226546,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.3862943611198906),
-                                    ("integer (21..99) - TYPE 2", -2.4849066497880004),
-                                    ("integer (1..4) - for ordinals", -0.8754687373538999),
-                                    ("few \47751", -1.5686159179138452)],
-                               n = 19}}),
-       ("noon",
-        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 hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList [("integer (1..4) - for ordinals", 0.0)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.5040773967762742),
-                                    ("<integer> <unit-of-duration>", -0.8109302162163288),
-                                    ("hour", -1.0986122886681098)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("month",
-        Classifier{okData =
-                     ClassData{prior = -5.5569851154810765e-2,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -5.5569851154810765e-2),
-                                    ("integer - TYPE 1", -2.917770732084279)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -2.917770732084279, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("integer - TYPE 1", -0.2876820724517809)],
-                               n = 2}}),
-       ("midnight|EOD|end of 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}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.3862943611198906), ("month", -1.3862943611198906),
-                                    ("day-of-week", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day", -1.252762968495368),
-                                    ("hour", -1.252762968495368)],
-                               n = 1}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.2992829841302609),
-                                    ("month (grain)", -2.3978952727983707),
-                                    ("year (grain)", -2.3978952727983707),
-                                    ("week (grain)", -1.2992829841302609),
-                                    ("year", -2.3978952727983707), ("month", -2.3978952727983707)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.0116009116784799, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716),
-                                    ("week (grain)", -1.6739764335716716),
-                                    ("day", -1.6739764335716716),
-                                    ("day (grain)", -1.6739764335716716)],
-                               n = 4}}),
-       ("christmas",
-        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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.367123614131617),
-                                    ("integer - TYPE 1year (grain)", -2.772588722239781),
-                                    ("integer - TYPE 1minute (grain)", -2.772588722239781),
-                                    ("integer (1..4) - for ordinalsmonth (grain)",
-                                     -2.772588722239781),
-                                    ("integer (numeric)year (grain)", -2.772588722239781),
-                                    ("integer - TYPE 1week (grain)", -2.772588722239781),
-                                    ("year", -2.367123614131617),
-                                    ("integer (numeric)week (grain)", -2.772588722239781),
-                                    ("hour", -2.772588722239781), ("month", -2.367123614131617),
-                                    ("integer (numeric)minute (grain)", -2.772588722239781),
-                                    ("integer (numeric)month (grain)", -2.772588722239781),
-                                    ("minute", -2.367123614131617),
-                                    ("integer (numeric)hour (grain)", -2.772588722239781)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("seconds",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.916290731874155),
-                                    ("integer (21..99) - TYPE 2", -0.916290731874155)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("integer - TYPE 1", -0.8472978603872037),
-                                    ("integer (21..99) - TYPE 2", -1.252762968495368)],
-                               n = 4}}),
-       ("<time> \47560\51648\47561 <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.540445040947149),
-                                    ("monthday (grain)", -1.9459101490553135),
-                                    ("monthweek", -1.540445040947149),
-                                    ("intersectweek (grain)", -1.9459101490553135),
-                                    ("intersectday (grain)", -1.9459101490553135),
-                                    ("monthweek (grain)", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.2039728043259361),
-                                    ("monthday (grain)", -1.6094379124341003),
-                                    ("intersectday (grain)", -1.6094379124341003)],
-                               n = 2}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.17589066646366416,
-                               unseen = -4.1588830833596715,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.044522437723423), ("second", -3.4499875458315876),
-                                    ("day", -2.5336968139574325), ("year", -3.044522437723423),
-                                    ("<integer> <unit-of-duration>", -1.1986957472250923),
-                                    ("a day - \54616\47336", -3.044522437723423),
-                                    ("<integer> and an half hours", -2.3513752571634776),
-                                    ("hour", -2.1972245773362196), ("minute", -1.6582280766035324),
-                                    ("about <duration>", -3.4499875458315876)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -1.824549292051046, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -1.252762968495368),
-                                    ("minute", -1.252762968495368)],
-                               n = 5}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.46262352194811296,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -2.7300291078209855),
-                                    ("intersectam|pm <time-of-day>", -2.7300291078209855),
-                                    ("minuteminute", -1.749199854809259),
-                                    ("hh:mmhh:mm", -2.03688192726104),
-                                    ("dayday", -1.8827312474337816),
-                                    ("hourhour", -2.2192034840549946),
-                                    ("intersectday", -2.7300291078209855),
-                                    ("am|pm <time-of-day>am|pm <time-of-day>", -2.7300291078209855),
-                                    ("intersectintersect", -2.7300291078209855)],
-                               n = 17},
-                   koData =
-                     ClassData{prior = -0.9932517730102834,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.8562979903656263),
-                                    ("time-of-dayam|pm <time-of-day>", -2.367123614131617),
-                                    ("intersectmonth", -2.367123614131617),
-                                    ("dayday", -2.367123614131617),
-                                    ("hourhour", -1.8562979903656263),
-                                    ("last <time>am|pm <time-of-day>", -2.367123614131617),
-                                    ("dayintersect", -2.367123614131617)],
-                               n = 10}}),
-       ("<time-of-day>\51060\51204",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("am|pm <time-of-day>", -1.540445040947149),
-                                    ("time-of-day", -1.540445040947149),
-                                    ("hour", -1.0296194171811581)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.791759469228055),
-                                    ("hour", -1.791759469228055), ("minute", -1.3862943611198906),
-                                    ("<hour-of-day> <integer> (as relative minutes)",
-                                     -1.3862943611198906)],
-                               n = 3}}),
-       ("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}}),
-       ("<1..4> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer - TYPE 1quarter (grain)", -0.916290731874155),
-                                    ("quarter", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)quarter (grain)", -0.916290731874155),
-                                    ("quarter", -0.916290731874155)],
-                               n = 1}}),
-       ("Children'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-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.9444616088408514, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.4271163556401458),
-                                    ("hh:mmhh:mm", -1.4271163556401458),
-                                    ("hourhour", -2.120263536200091),
-                                    ("am|pm <time-of-day>am|pm <time-of-day>", -2.120263536200091)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -0.49247648509779407,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-dayam|pm <time-of-day>", -2.3978952727983707),
-                                    ("time-of-daytime-of-day (latent)", -2.803360380906535),
-                                    ("hh:mmtime-of-day (latent)", -1.7047480922384253),
-                                    ("am|pm <time-of-day>time-of-day (latent)", -2.803360380906535),
-                                    ("am|pm <time-of-day><time-of-day>\51060\51204",
-                                     -2.803360380906535),
-                                    ("hourhour", -1.550597412411167),
-                                    ("time-of-day<time-of-day>\51060\51204", -2.803360380906535),
-                                    ("minutehour", -1.7047480922384253)],
-                               n = 11}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.5902671654458267), ("second", -2.5902671654458267),
-                                    ("integer - TYPE 1minute (grain)", -2.995732273553991),
-                                    ("integer (1..4) - for ordinalsmonth (grain)",
-                                     -2.995732273553991),
-                                    ("integer (1..4) - for ordinalshour (grain)",
-                                     -2.995732273553991),
-                                    ("integer (numeric)second (grain)", -2.995732273553991),
-                                    ("integer (21..99) - TYPE 2hour (grain)", -2.995732273553991),
-                                    ("integer - TYPE 1week (grain)", -2.995732273553991),
-                                    ("integer (numeric)week (grain)", -2.995732273553991),
-                                    ("hour", -2.0794415416798357), ("month", -2.5902671654458267),
-                                    ("integer - TYPE 1second (grain)", -2.995732273553991),
-                                    ("integer (numeric)minute (grain)", -2.995732273553991),
-                                    ("integer (numeric)month (grain)", -2.995732273553991),
-                                    ("minute", -2.5902671654458267),
-                                    ("integer (numeric)hour (grain)", -2.5902671654458267)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> half (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter (grain)",
-        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}}),
-       ("morning",
-        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 = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("lunch", -1.8718021769015913),
-                                    ("time-of-day (latent)", -1.8718021769015913),
-                                    ("am|pm <time-of-day>", -1.8718021769015913),
-                                    ("time-of-day", -1.8718021769015913),
-                                    ("hour", -0.9555114450274363)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.7884573603642702),
-                                    ("hour", -0.7884573603642702)],
-                               n = 14}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = -1.1727202608218315, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -0.37037378829689427,
-                               unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 29}}),
-       ("the day after tomorrow - \45236\51068\47784\47112",
-        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}}),
-       ("compose by multiplication",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer - TYPE 1integer - TYPE 1: powers of ten", 0.0)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> and an half hours", -1.0986122886681098),
-                                    ("minute", -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>", -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 1}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-daycompose by multiplication", -1.8718021769015913),
-                                    ("time-of-dayinteger (numeric)", -1.8718021769015913),
-                                    ("hour", -1.1786549963416462),
-                                    ("time-of-dayinteger (21..99) - TYPE 2", -1.8718021769015913)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (21..99) - TYPE 2",
-                                     -2.2512917986064953),
-                                    ("time-of-day (latent)integer - TYPE 1", -1.55814461804655),
-                                    ("time-of-day (latent)integer - TYPE 1: powers of ten",
-                                     -2.2512917986064953),
-                                    ("hour", -0.9985288301111273),
-                                    ("time-of-dayinteger (21..99) - TYPE 2", -2.2512917986064953)],
-                               n = 6}}),
-       ("few \47751",
-        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}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("season", -1.466337068793427), ("day", -1.466337068793427),
-                                    ("hour", -1.466337068793427), ("morning", -1.8718021769015913),
-                                    ("week-end", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day-of-week",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.713572066704308,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 39},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("within <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/KO_XX.hs b/Duckling/Ranking/Classifiers/KO_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/KO_XX.hs
@@ -0,0 +1,1444 @@
+-- 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.KO_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm", -1.3862943611198906),
+                                    ("hh:mm", -1.3862943611198906), ("hour", -1.3862943611198906),
+                                    ("minute", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.4267425065554492, unseen = -4.836281906951478,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 124},
+                   koData =
+                     ClassData{prior = -1.0573693301340605, unseen = -4.219507705176107,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 66}}),
+       ("lunch",
+        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 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (21..99) - TYPE 2",
+                                     -0.40546510810816444)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer - TYPE 1: powers of teninteger (21..99) - TYPE 2",
+                                     -0.40546510810816444)],
+                               n = 1}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037, unseen = -4.143134726391533,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.1826954058786512),
+                                    ("day-of-weekmorning", -3.4339872044851463),
+                                    ("yesterdayevening|night", -3.4339872044851463),
+                                    ("mm/ddafternoon", -3.4339872044851463),
+                                    ("todayafternoon", -3.4339872044851463),
+                                    ("dayevening|night", -3.4339872044851463),
+                                    ("todayevening|night", -2.740840023925201),
+                                    ("daymorning", -3.4339872044851463),
+                                    ("intersectevening|night", -3.4339872044851463),
+                                    ("next <cycle>evening|night", -3.028522096376982),
+                                    ("tomorrowlunch", -3.4339872044851463),
+                                    ("intersectmorning", -3.4339872044851463),
+                                    ("the day before yesterday - \50634\44536\51228morning",
+                                     -3.4339872044851463),
+                                    ("tomorrowevening|night", -3.028522096376982),
+                                    ("next <cycle>lunch", -3.4339872044851463)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -0.5596157879354228, unseen = -4.31748811353631,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)lunch", -3.6109179126442243),
+                                    ("dayhour", -1.8191584434161694),
+                                    ("yearhour", -1.906169820405799),
+                                    ("time-of-day (latent)evening|night", -3.6109179126442243),
+                                    ("year (latent)evening|night", -2.512305623976115),
+                                    ("hourhour", -2.917770732084279),
+                                    ("time-of-day (latent)lunch", -3.6109179126442243),
+                                    ("intersectafternoon", -2.10684051586795),
+                                    ("year (latent)afternoon", -3.20545280453606),
+                                    ("day-of-weekafternoon", -3.6109179126442243),
+                                    ("next <cycle>evening|night", -3.6109179126442243),
+                                    ("time-of-day (latent)afternoon", -3.6109179126442243),
+                                    ("year (latent)morning", -3.20545280453606),
+                                    ("tomorrowevening|night", -3.6109179126442243)],
+                               n = 24}}),
+       ("<time> nth <time> - 3\50900 \52395\51704 \54868\50836\51068",
+        Classifier{okData =
+                     ClassData{prior = -0.6190392084062235, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -0.7537718023763802),
+                                    ("intersectordinals (\52395\48264\51704)day-of-week",
+                                     -0.8873031950009028),
+                                    ("monthordinals (\52395\48264\51704)day-of-week",
+                                     -2.1400661634962708)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.7731898882334817, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -0.7621400520468967),
+                                    ("monthordinals (\52395\48264\51704)day-of-week",
+                                     -0.7621400520468967)],
+                               n = 6}}),
+       ("the day before yesterday - \50634\44536\51228",
+        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}}),
+       ("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 = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half - \48152",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("month (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}}),
+       ("<time> \47560\51648\47561 <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectday-of-week", -1.5040773967762742),
+                                    ("monthday", -0.8109302162163288),
+                                    ("monthday-of-week", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer - TYPE 1",
+        Classifier{okData =
+                     ClassData{prior = -1.8523840910444898, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -0.17062551703076334,
+                               unseen = -4.875197323201151,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 129}}),
+       ("fraction",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.6359887667199967),
+                                    ("fractioninteger (numeric)", -1.4469189829363254),
+                                    ("integer (numeric)fraction", -1.4469189829363254)],
+                               n = 14}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.241713132308783, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -0.3409265869705932,
+                               unseen = -3.5263605246161616,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 32}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4488272263819219, unseen = -5.958424693029782,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect<hour-of-day> <integer> (as relative minutes)",
+                                     -5.262690188904886),
+                                    ("intersectday-of-week", -4.164077900236776),
+                                    ("year<time> \47560\51648\47561 <cycle>", -4.857225080796721),
+                                    ("next <cycle>day-of-week", -4.3463994570307305),
+                                    ("dayhour", -2.0240117367405053),
+                                    ("monthday", -2.4294768448486694),
+                                    ("yearhour", -3.5579420966664603),
+                                    ("<time> <part-of-day>time-of-day", -4.3463994570307305),
+                                    ("intersectam|pm <time-of-day>", -3.065465611568666),
+                                    ("next <cycle><time-of-day> am|pm", -5.262690188904886),
+                                    ("next <cycle>am|pm <time-of-day>", -4.857225080796721),
+                                    ("yearintersect", -2.96010509591084),
+                                    ("day-of-week<datetime> - <datetime> (interval)",
+                                     -4.3463994570307305),
+                                    ("day-of-week<time-of-day> - <time-of-day> (interval)",
+                                     -4.3463994570307305),
+                                    ("monthday with korean number - \51068\51068..\44396\51068",
+                                     -5.262690188904886),
+                                    ("dayday-of-week", -4.3463994570307305),
+                                    ("this <cycle>day-of-week", -4.857225080796721),
+                                    ("day-of-week<time> timezone", -5.262690188904886),
+                                    ("monthhour", -3.5579420966664603),
+                                    ("mm/ddam|pm <time-of-day>", -4.56954300834494),
+                                    ("todayam|pm <time-of-day>", -4.56954300834494),
+                                    ("the day before yesterday - \50634\44536\51228am|pm <time-of-day>",
+                                     -4.3463994570307305),
+                                    ("dayday", -3.653252276470785),
+                                    ("hourhour", -3.7586127921286114),
+                                    ("year<time> <ordinal> <cycle>", -5.262690188904886),
+                                    ("month<datetime> - <datetime> (interval)", -4.857225080796721),
+                                    ("dayam|pm <time-of-day>", -5.262690188904886),
+                                    ("day-of-weekam|pm <time-of-day>", -4.56954300834494),
+                                    ("time-of-dayafter <time-of-day>", -5.262690188904886),
+                                    ("monthminute", -4.857225080796721),
+                                    ("hourminute", -4.56954300834494),
+                                    ("intersectday", -4.164077900236776),
+                                    ("am|pm <time-of-day>after <time-of-day>", -5.262690188904886),
+                                    ("last <cycle>day-of-week", -4.56954300834494),
+                                    ("month<time> <part-of-day>", -4.857225080796721),
+                                    ("yearmonth", -3.122624025408615),
+                                    ("dayminute", -3.653252276470785),
+                                    ("today<date>\50640", -5.262690188904886),
+                                    ("mm/dd<date>\50640", -5.262690188904886),
+                                    ("<hour-of-day> <integer> (as relative minutes)seconds",
+                                     -5.262690188904886),
+                                    ("<time> <part-of-day><date>\50640", -4.857225080796721),
+                                    ("monthintersect", -3.653252276470785),
+                                    ("year<time> \47560\51648\47561 <day-of-week>",
+                                     -5.262690188904886),
+                                    ("intersectintersect", -3.4709307196768306),
+                                    ("weekday", -3.653252276470785),
+                                    ("intersectday with korean number - \51068\51068..\44396\51068",
+                                     -4.857225080796721),
+                                    ("yearday", -3.4709307196768306),
+                                    ("day-of-weekhh:mm", -4.857225080796721),
+                                    ("yearweek", -4.857225080796721),
+                                    ("minutesecond", -5.262690188904886),
+                                    ("<time> <part-of-day><hour-of-day> <integer> (as relative minutes)",
+                                     -4.857225080796721),
+                                    ("tomorrow<time-of-day> am|pm", -5.262690188904886),
+                                    ("tomorrowam|pm <time-of-day>", -4.857225080796721),
+                                    ("dayintersect", -4.857225080796721),
+                                    ("day-of-weektime-of-day", -5.262690188904886)],
+                               n = 173},
+                   koData =
+                     ClassData{prior = -1.017151342209129, unseen = -5.594711379601839,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year<time> \47560\51648\47561 <cycle>", -4.897839799950911),
+                                    ("day-of-weekintersect", -4.897839799950911),
+                                    ("dayhour", -2.2587824703356527),
+                                    ("daymonth", -4.492374691842747),
+                                    ("monthday", -3.1060803307228566),
+                                    ("yearhour", -3.1930917077124863),
+                                    ("<time> <part-of-day>time-of-day", -3.7992275112828016),
+                                    ("houryear", -4.204692619390966),
+                                    ("day-of-weekafter <time-of-day>", -4.897839799950911),
+                                    ("after <time-of-day>by <time> - \44620\51648",
+                                     -4.897839799950911),
+                                    ("intersectam|pm <time-of-day>", -4.492374691842747),
+                                    ("intersect<time> <part-of-day>", -3.9815490680767565),
+                                    ("yearintersect", -3.02603762304932),
+                                    ("day-of-week<time-of-day> - <time-of-day> (interval)",
+                                     -3.9815490680767565),
+                                    ("intersectmonth", -4.897839799950911),
+                                    ("time-of-day<duration> ago", -4.897839799950911),
+                                    ("this <cycle>day-of-week", -4.492374691842747),
+                                    ("intersecttime-of-day", -4.492374691842747),
+                                    ("monthhour", -3.02603762304932),
+                                    ("intersectlast <time>", -4.897839799950911),
+                                    ("dayday", -3.9815490680767565),
+                                    ("hourhour", -2.951929650895598),
+                                    ("month<datetime> - <datetime> (interval)",
+                                     -3.9815490680767565),
+                                    ("dayam|pm <time-of-day>", -4.492374691842747),
+                                    ("day-of-weekam|pm <time-of-day>", -4.897839799950911),
+                                    ("hourminute", -4.204692619390966),
+                                    ("<time-of-day> - <time-of-day> (interval)last <time>",
+                                     -3.9815490680767565),
+                                    ("intersectday", -4.492374691842747),
+                                    ("<datetime> - <datetime> (interval)day", -3.9815490680767565),
+                                    ("month<time> <part-of-day>", -4.492374691842747),
+                                    ("yearmonth", -4.492374691842747),
+                                    ("dayminute", -4.204692619390966),
+                                    ("<time> <part-of-day><date>\50640", -4.897839799950911),
+                                    ("last <time>time-of-day", -4.897839799950911),
+                                    ("monthintersect", -3.288401887516811),
+                                    ("hoursecond", -4.897839799950911),
+                                    ("year<time> <part-of-day>", -4.492374691842747),
+                                    ("intersectintersect", -3.6450768314555435),
+                                    ("weekday", -4.492374691842747),
+                                    ("intersectday with korean number - \51068\51068..\44396\51068",
+                                     -4.492374691842747),
+                                    ("day<time> <part-of-day>", -4.897839799950911),
+                                    ("yearday", -3.7992275112828016),
+                                    ("day-of-weekhh:mm", -4.897839799950911),
+                                    ("<time-of-day> - <time-of-day> (interval)time-of-day",
+                                     -4.492374691842747),
+                                    ("intersectafter <time-of-day>", -3.3937624031746374),
+                                    ("<time> <part-of-day><hour-of-day> <integer> (as relative minutes)",
+                                     -4.492374691842747),
+                                    ("dayintersect", -4.897839799950911),
+                                    ("mm/ddafter <time-of-day>", -4.897839799950911),
+                                    ("todayafter <time-of-day>", -4.897839799950911)],
+                               n = 98}}),
+       ("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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.0608719606852628,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -0.42488319396526597,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.12516314295400605,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("month (grain)", -3.044522437723423),
+                                    ("year (grain)", -3.044522437723423),
+                                    ("week (grain)", -1.791759469228055),
+                                    ("day", -1.791759469228055), ("quarter", -3.044522437723423),
+                                    ("year", -3.044522437723423), ("month", -3.044522437723423),
+                                    ("quarter (grain)", -3.044522437723423),
+                                    ("day (grain)", -1.791759469228055)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -2.1400661634962708, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.0794415416798357),
+                                    ("minute (grain)", -2.0794415416798357),
+                                    ("minute", -2.0794415416798357),
+                                    ("day (grain)", -2.0794415416798357)],
+                               n = 2}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("day-of-week", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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 = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.9315582040049435),
+                                    ("integer - TYPE 1", -0.8574502318512216),
+                                    ("integer (21..99) - TYPE 2", -2.803360380906535),
+                                    ("integer (1..4) - for ordinals", -2.1102132003465894)],
+                               n = 29}}),
+       ("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}}),
+       ("evening|night",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Memorial 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}}),
+       ("yesterday",
+        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 (20..90) - TYPE 2 and ordinals",
+        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}}),
+       ("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}}),
+       ("by <time> - \44620\51648",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("am|pm <time-of-day>", -1.252762968495368),
+                                    ("time-of-day", -1.252762968495368),
+                                    ("hour", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month>\50640",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("month", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (21..99) - TYPE 2",
+        Classifier{okData =
+                     ClassData{prior = -0.587786664902119, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (20..90) - TYPE 2 and ordinalsinteger (1..4) - for ordinals",
+                                     -1.6094379124341003),
+                                    ("integer - TYPE 1: powers of teninteger - TYPE 1",
+                                     -1.2039728043259361),
+                                    ("compose by multiplicationinteger - TYPE 1",
+                                     -1.2039728043259361)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.8109302162163288,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -1.5040773967762742),
+                                    ("integer - TYPE 1: powers of teninteger - TYPE 1",
+                                     -1.0986122886681098),
+                                    ("integer (numeric)integer - TYPE 1", -1.5040773967762742)],
+                               n = 4}}),
+       ("Independence Movement 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}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.17589066646366416,
+                               unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
+                   koData =
+                     ClassData{prior = -1.824549292051046, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("<year> <1..4>quarter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearinteger (numeric)quarter (grain)", -0.6931471805599453),
+                                    ("yearquarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("christmas 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}}),
+       ("Liberation 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}}),
+       ("numbers prefix with -, \47560\51060\45320\49828, or \47560\51060\45208\49828",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 7}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("tomorrow",
+        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}}),
+       ("National Foundation 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}}),
+       ("ordinals (\52395\48264\51704)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (1..4) - for ordinals", -0.35667494393873245),
+                                    ("integer (1..10) - TYPE 2", -1.2039728043259361)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day",
+        Classifier{okData =
+                     ClassData{prior = -0.2657031657330056, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -8.338160893905101e-2),
+                                    ("integer - TYPE 1", -2.5257286443082556)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -1.455287232606842, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.25131442828090605),
+                                    ("integer - TYPE 1", -1.5040773967762742)],
+                               n = 7}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 7}}),
+       ("afternoon",
+        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}}),
+       ("integer (1..4) - for ordinals",
+        Classifier{okData =
+                     ClassData{prior = -3.7740327982847086e-2,
+                               unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
+                   koData =
+                     ClassData{prior = -3.295836866004329, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<time> <ordinal> <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthordinals (\52395\48264\51704)week (grain)",
+                                     -1.252762968495368),
+                                    ("monthweek", -0.8472978603872037),
+                                    ("intersectordinals (\52395\48264\51704)week (grain)",
+                                     -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("minute (grain)", -2.0794415416798357),
+                                    ("minute", -2.0794415416798357)],
+                               n = 4}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.6359887667199967,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -0.7537718023763802,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.252762968495368),
+                                    ("time-of-day", -1.252762968495368),
+                                    ("hour", -0.8472978603872037)],
+                               n = 2}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -1.289667525430819, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.579818495252942),
+                                    ("integer - TYPE 1", -2.5257286443082556),
+                                    ("integer (1..4) - for ordinals", -1.6094379124341003),
+                                    ("integer (1..10) - TYPE 2", -2.5257286443082556)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.32208349916911333, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.9343092373768334),
+                                    ("integer - TYPE 1", -0.8898574748059995),
+                                    ("integer (20..90) - TYPE 2 and ordinals", -3.332204510175204),
+                                    ("integer (21..99) - TYPE 2", -3.332204510175204),
+                                    ("integer (1..4) - for ordinals", -2.2335922215070942)],
+                               n = 50}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -1.006804739414987, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3677247801253174),
+                                    ("intersect 2 numbers", -2.5649493574615367),
+                                    ("integer (21..99) - TYPE 2", -2.5649493574615367)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -0.4547361571149472, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.5533852381847867),
+                                    ("intersect 2 numbers", -2.3025850929940455),
+                                    ("integer - TYPE 1", -2.0794415416798357),
+                                    ("fraction", -2.995732273553991),
+                                    ("integer - TYPE 1: powers of ten", -2.5902671654458267),
+                                    ("compose by multiplication", -2.995732273553991)],
+                               n = 33}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -1.5955488002734333,
+                               unseen = -4.5217885770490405,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.7191000372887952),
+                                    ("integer - TYPE 1year (grain)", -3.41224721784874),
+                                    ("integer (numeric)day (grain)", -2.5649493574615367),
+                                    ("second", -3.817712325956905),
+                                    ("integer - TYPE 1minute (grain)", -2.9014215940827497),
+                                    ("integer (1..4) - for ordinalshour (grain)",
+                                     -3.41224721784874),
+                                    ("integer (numeric)second (grain)", -3.817712325956905),
+                                    ("integer (numeric)year (grain)", -3.41224721784874),
+                                    ("day", -2.5649493574615367), ("year", -2.9014215940827497),
+                                    ("integer (numeric)week (grain)", -2.7191000372887952),
+                                    ("hour", -2.3136349291806306),
+                                    ("integer (numeric)minute (grain)", -3.817712325956905),
+                                    ("few \47751hour (grain)", -2.9014215940827497),
+                                    ("minute", -2.7191000372887952),
+                                    ("integer (numeric)hour (grain)", -3.41224721784874)],
+                               n = 29},
+                   koData =
+                     ClassData{prior = -0.22664618186541183,
+                               unseen = -5.568344503761097,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.955082494888593),
+                                    ("integer - TYPE 1quarter (grain)", -4.871373226762748),
+                                    ("integer - TYPE 1day (grain)", -4.178226046202803),
+                                    ("integer - TYPE 1year (grain)", -4.465908118654584),
+                                    ("integer (numeric)day (grain)", -2.4290261913935436),
+                                    ("intersect 2 numbersyear (grain)", -4.465908118654584),
+                                    ("integer (numeric)quarter (grain)", -4.871373226762748),
+                                    ("compose by multiplicationminute (grain)", -4.871373226762748),
+                                    ("second", -3.7727609380946383),
+                                    ("integer - TYPE 1minute (grain)", -3.7727609380946383),
+                                    ("integer (1..4) - for ordinalsmonth (grain)",
+                                     -4.465908118654584),
+                                    ("integer (1..4) - for ordinalshour (grain)",
+                                     -2.7313070632664775),
+                                    ("integer (numeric)second (grain)", -4.871373226762748),
+                                    ("integer (numeric)year (grain)", -2.6741486494265287),
+                                    ("integer (21..99) - TYPE 2hour (grain)", -4.871373226762748),
+                                    ("integer - TYPE 1week (grain)", -4.465908118654584),
+                                    ("day", -2.3064238693012116), ("quarter", -4.465908118654584),
+                                    ("year", -2.4290261913935436),
+                                    ("integer (21..99) - TYPE 2minute (grain)", -4.178226046202803),
+                                    ("integer (numeric)week (grain)", -4.465908118654584),
+                                    ("integer (1..10) - TYPE 2hour (grain)", -4.871373226762748),
+                                    ("hour", -1.900958761193047), ("month", -3.955082494888593),
+                                    ("integer - TYPE 1second (grain)", -4.465908118654584),
+                                    ("integer (numeric)minute (grain)", -3.955082494888593),
+                                    ("integer (numeric)month (grain)", -4.465908118654584),
+                                    ("integer (21..99) - TYPE 2year (grain)", -4.871373226762748),
+                                    ("minute", -2.856470206220483),
+                                    ("integer - TYPE 1: powers of tenminute (grain)",
+                                     -4.871373226762748),
+                                    ("integer (numeric)hour (grain)", -2.5199979695992702),
+                                    ("integer (21..99) - TYPE 2second (grain)",
+                                     -4.465908118654584)],
+                               n = 114}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.3746934494414107, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.6486586255873816),
+                                    ("hh:mm", -1.1786549963416462), ("hour", -1.6486586255873816),
+                                    ("minute", -1.1786549963416462)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -1.1631508098056809, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.8472978603872037),
+                                    ("hour", -0.8472978603872037)],
+                               n = 5}}),
+       ("a day - \54616\47336",
+        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}}),
+       ("am|pm <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.23262229526875347,
+                               unseen = -4.543294782270004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.824549292051046),
+                                    ("<date>\50640", -3.146305132033365),
+                                    ("time-of-day", -1.536867219599265),
+                                    ("hour", -0.8437200390393196),
+                                    ("<time-of-day>\51060\51204", -3.4339872044851463),
+                                    ("<hour-of-day> half (as relative minutes)",
+                                     -3.8394523125933104),
+                                    ("minute", -3.146305132033365),
+                                    ("after <time-of-day>", -3.8394523125933104),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -3.4339872044851463)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.5723966407537513,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.2367626271489267),
+                                    ("time-of-day", -2.0476928433652555),
+                                    ("hour", -0.9490805546971459)],
+                               n = 11}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -4.445176257083381e-2,
+                               unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
+                   koData =
+                     ClassData{prior = -3.1354942159291497,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("integer - TYPE 1: powers of ten",
+        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 with korean number - \51068\51068..\44396\51068",
+        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}}),
+       ("second (grain)",
+        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}}),
+       ("Hangul 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}}),
+       ("<integer> (hour-of-day) relative minutes \51204",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("time-of-dayinteger (21..99) - TYPE 2", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8971199848858813), ("day", -1.6094379124341003),
+                                    ("year", -1.8971199848858813),
+                                    ("<integer> <unit-of-duration>", -0.916290731874155)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.0116009116784799, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.0296194171811581),
+                                    ("hour", -1.540445040947149), ("minute", -1.540445040947149)],
+                               n = 4}}),
+       ("Constitution 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}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -2.833213344056216, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -2.03688192726104), ("hour", -2.03688192726104),
+                                    ("week-end", -2.03688192726104),
+                                    ("day-of-week", -2.03688192726104)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -6.0624621816434854e-2,
+                               unseen = -4.969813299576001,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -3.8642323415917974),
+                                    ("year (latent)", -1.967112356705916),
+                                    ("second", -3.8642323415917974),
+                                    ("time-of-day (latent)", -1.9183221925364844),
+                                    ("year", -1.967112356705916),
+                                    ("<duration> ago", -3.8642323415917974),
+                                    ("time-of-day", -2.477937980471907),
+                                    ("hour", -1.1786549963416462), ("seconds", -3.8642323415917974),
+                                    ("<datetime> - <datetime> (interval)", -3.8642323415917974),
+                                    ("<time-of-day>\51060\51204", -3.8642323415917974),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -3.353406717825807)],
+                               n = 64}}),
+       ("<date>\50640",
+        Classifier{okData =
+                     ClassData{prior = -7.410797215372185e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.824549292051046), ("day", -2.3353749158170367),
+                                    ("am|pm <time-of-day>", -2.0476928433652555),
+                                    ("<duration> ago", -2.740840023925201),
+                                    ("time-of-day", -2.0476928433652555),
+                                    ("hour", -1.0360919316867756), ("month", -2.740840023925201)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -2.639057329615259, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.5040773967762742),
+                                    ("hour", -1.5040773967762742)],
+                               n = 1}}),
+       ("integer (1..10) - TYPE 2",
+        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}}),
+       ("time-of-day",
+        Classifier{okData =
+                     ClassData{prior = -0.5328045304847658,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.5753641449035618),
+                                    ("integer (1..4) - for ordinals", -1.1631508098056809),
+                                    ("integer (1..10) - TYPE 2", -2.772588722239781)],
+                               n = 27},
+                   koData =
+                     ClassData{prior = -0.8842024173226546,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3862943611198906),
+                                    ("integer (21..99) - TYPE 2", -2.4849066497880004),
+                                    ("integer (1..4) - for ordinals", -0.8754687373538999),
+                                    ("few \47751", -1.5686159179138452)],
+                               n = 19}}),
+       ("noon",
+        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 hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("integer (1..4) - for ordinals", 0.0)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.5040773967762742),
+                                    ("<integer> <unit-of-duration>", -0.8109302162163288),
+                                    ("hour", -1.0986122886681098)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1}}),
+       ("month",
+        Classifier{okData =
+                     ClassData{prior = -5.5569851154810765e-2,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -5.5569851154810765e-2),
+                                    ("integer - TYPE 1", -2.917770732084279)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -2.917770732084279, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer - TYPE 1", -0.2876820724517809)],
+                               n = 2}}),
+       ("midnight|EOD|end of 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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.3862943611198906), ("month", -1.3862943611198906),
+                                    ("day-of-week", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day", -1.252762968495368),
+                                    ("hour", -1.252762968495368)],
+                               n = 1}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.2992829841302609),
+                                    ("month (grain)", -2.3978952727983707),
+                                    ("year (grain)", -2.3978952727983707),
+                                    ("week (grain)", -1.2992829841302609),
+                                    ("year", -2.3978952727983707), ("month", -2.3978952727983707)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.0116009116784799, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("day", -1.6739764335716716),
+                                    ("day (grain)", -1.6739764335716716)],
+                               n = 4}}),
+       ("christmas",
+        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}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.367123614131617),
+                                    ("integer - TYPE 1year (grain)", -2.772588722239781),
+                                    ("integer - TYPE 1minute (grain)", -2.772588722239781),
+                                    ("integer (1..4) - for ordinalsmonth (grain)",
+                                     -2.772588722239781),
+                                    ("integer (numeric)year (grain)", -2.772588722239781),
+                                    ("integer - TYPE 1week (grain)", -2.772588722239781),
+                                    ("year", -2.367123614131617),
+                                    ("integer (numeric)week (grain)", -2.772588722239781),
+                                    ("hour", -2.772588722239781), ("month", -2.367123614131617),
+                                    ("integer (numeric)minute (grain)", -2.772588722239781),
+                                    ("integer (numeric)month (grain)", -2.772588722239781),
+                                    ("minute", -2.367123614131617),
+                                    ("integer (numeric)hour (grain)", -2.772588722239781)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("seconds",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.916290731874155),
+                                    ("integer (21..99) - TYPE 2", -0.916290731874155)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.252762968495368),
+                                    ("integer - TYPE 1", -0.8472978603872037),
+                                    ("integer (21..99) - TYPE 2", -1.252762968495368)],
+                               n = 4}}),
+       ("<time> \47560\51648\47561 <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.540445040947149),
+                                    ("monthday (grain)", -1.9459101490553135),
+                                    ("monthweek", -1.540445040947149),
+                                    ("intersectweek (grain)", -1.9459101490553135),
+                                    ("intersectday (grain)", -1.9459101490553135),
+                                    ("monthweek (grain)", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -1.2039728043259361),
+                                    ("monthday (grain)", -1.6094379124341003),
+                                    ("intersectday (grain)", -1.6094379124341003)],
+                               n = 2}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.17589066646366416,
+                               unseen = -4.1588830833596715,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.044522437723423), ("second", -3.4499875458315876),
+                                    ("day", -2.5336968139574325), ("year", -3.044522437723423),
+                                    ("<integer> <unit-of-duration>", -1.1986957472250923),
+                                    ("a day - \54616\47336", -3.044522437723423),
+                                    ("<integer> and an half hours", -2.3513752571634776),
+                                    ("hour", -2.1972245773362196), ("minute", -1.6582280766035324),
+                                    ("about <duration>", -3.4499875458315876)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.824549292051046, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -1.252762968495368),
+                                    ("minute", -1.252762968495368)],
+                               n = 5}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.46262352194811296,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -2.7300291078209855),
+                                    ("intersectam|pm <time-of-day>", -2.7300291078209855),
+                                    ("minuteminute", -1.749199854809259),
+                                    ("hh:mmhh:mm", -2.03688192726104),
+                                    ("dayday", -1.8827312474337816),
+                                    ("hourhour", -2.2192034840549946),
+                                    ("intersectday", -2.7300291078209855),
+                                    ("am|pm <time-of-day>am|pm <time-of-day>", -2.7300291078209855),
+                                    ("intersectintersect", -2.7300291078209855)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.9932517730102834,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.8562979903656263),
+                                    ("time-of-dayam|pm <time-of-day>", -2.367123614131617),
+                                    ("intersectmonth", -2.367123614131617),
+                                    ("dayday", -2.367123614131617),
+                                    ("hourhour", -1.8562979903656263),
+                                    ("last <time>am|pm <time-of-day>", -2.367123614131617),
+                                    ("dayintersect", -2.367123614131617)],
+                               n = 10}}),
+       ("<time-of-day>\51060\51204",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("am|pm <time-of-day>", -1.540445040947149),
+                                    ("time-of-day", -1.540445040947149),
+                                    ("hour", -1.0296194171811581)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.6094379124341003),
+                                    ("hour", -1.6094379124341003), ("minute", -1.6094379124341003),
+                                    ("<hour-of-day> <integer> (as relative minutes)",
+                                     -1.6094379124341003)],
+                               n = 2}}),
+       ("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}}),
+       ("<1..4> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer - TYPE 1quarter (grain)", -0.916290731874155),
+                                    ("quarter", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)quarter (grain)", -0.916290731874155),
+                                    ("quarter", -0.916290731874155)],
+                               n = 1}}),
+       ("Children'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-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.9444616088408514, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.4271163556401458),
+                                    ("hh:mmhh:mm", -1.4271163556401458),
+                                    ("hourhour", -2.120263536200091),
+                                    ("am|pm <time-of-day>am|pm <time-of-day>", -2.120263536200091)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.49247648509779407,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-dayam|pm <time-of-day>", -2.3978952727983707),
+                                    ("time-of-daytime-of-day (latent)", -2.803360380906535),
+                                    ("hh:mmtime-of-day (latent)", -1.7047480922384253),
+                                    ("am|pm <time-of-day>time-of-day (latent)", -2.803360380906535),
+                                    ("am|pm <time-of-day><time-of-day>\51060\51204",
+                                     -2.803360380906535),
+                                    ("hourhour", -1.550597412411167),
+                                    ("time-of-day<time-of-day>\51060\51204", -2.803360380906535),
+                                    ("minutehour", -1.7047480922384253)],
+                               n = 11}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5902671654458267), ("second", -2.5902671654458267),
+                                    ("integer - TYPE 1minute (grain)", -2.995732273553991),
+                                    ("integer (1..4) - for ordinalsmonth (grain)",
+                                     -2.995732273553991),
+                                    ("integer (1..4) - for ordinalshour (grain)",
+                                     -2.995732273553991),
+                                    ("integer (numeric)second (grain)", -2.995732273553991),
+                                    ("integer (21..99) - TYPE 2hour (grain)", -2.995732273553991),
+                                    ("integer - TYPE 1week (grain)", -2.995732273553991),
+                                    ("integer (numeric)week (grain)", -2.995732273553991),
+                                    ("hour", -2.0794415416798357), ("month", -2.5902671654458267),
+                                    ("integer - TYPE 1second (grain)", -2.995732273553991),
+                                    ("integer (numeric)minute (grain)", -2.995732273553991),
+                                    ("integer (numeric)month (grain)", -2.995732273553991),
+                                    ("minute", -2.5902671654458267),
+                                    ("integer (numeric)hour (grain)", -2.5902671654458267)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> half (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        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}}),
+       ("morning",
+        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 = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.5040773967762742, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("lunch", -1.8718021769015913),
+                                    ("time-of-day (latent)", -1.8718021769015913),
+                                    ("am|pm <time-of-day>", -1.8718021769015913),
+                                    ("time-of-day", -1.8718021769015913),
+                                    ("hour", -0.9555114450274363)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.7884573603642702),
+                                    ("hour", -0.7884573603642702)],
+                               n = 14}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.1727202608218315, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -0.37037378829689427,
+                               unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 29}}),
+       ("the day after tomorrow - \45236\51068\47784\47112",
+        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}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer - TYPE 1integer - TYPE 1: powers of ten", 0.0)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> and an half hours", -1.0986122886681098),
+                                    ("minute", -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("<hour-of-day> <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-daycompose by multiplication", -1.6094379124341003),
+                                    ("time-of-dayinteger (numeric)", -1.6094379124341003),
+                                    ("hour", -0.916290731874155),
+                                    ("time-of-dayinteger (21..99) - TYPE 2", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -1.0986122886681098),
+                                    ("time-of-dayinteger (21..99) - TYPE 2", -1.0986122886681098)],
+                               n = 1}}),
+       ("few \47751",
+        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}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("season", -1.466337068793427), ("day", -1.466337068793427),
+                                    ("hour", -1.466337068793427), ("morning", -1.8718021769015913),
+                                    ("week-end", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day-of-week",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.713572066704308,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 39},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("within <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/MY.hs b/Duckling/Ranking/Classifiers/MY.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/MY.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.MY (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/MY_XX.hs b/Duckling/Ranking/Classifiers/MY_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/MY_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.MY_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/NB.hs b/Duckling/Ranking/Classifiers/NB.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/NB.hs
+++ /dev/null
@@ -1,1603 +0,0 @@
--- 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.NB (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.4350845252893227),
-                                    ("<time-of-day> o'clock", -2.3513752571634776),
-                                    ("hh:mm", -1.6582280766035324), ("hour", -1.6582280766035324),
-                                    ("minute", -1.252762968495368)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.7546493803177391, unseen = -4.912654885736052,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 134},
-                   koData =
-                     ClassData{prior = -0.6352093434537263, unseen = -5.030437921392435,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 151}}),
-       ("the day before yesterday",
-        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}}),
-       ("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}}),
-       ("lunch",
-        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> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.0986122886681098),
-                                    ("tomorrowevening", -2.0149030205422647),
-                                    ("named-daymorning", -2.0149030205422647),
-                                    ("tomorrowlunch", -2.0149030205422647),
-                                    ("yesterdayevening", -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -1.1786549963416462),
-                                    ("year (latent)in|during the <part-of-day>",
-                                     -1.1786549963416462)],
-                               n = 3}}),
-       ("dd/mm",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("today",
-        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}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2657031657330056, unseen = -4.605170185988091,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.4965075614664802),
-                                    ("time-of-day (latent)", -1.2278240201481159),
-                                    ("relative minutes after|past <integer> (hour-of-day)",
-                                     -3.4965075614664802),
-                                    ("hh:mm", -2.030170492673053),
-                                    ("<time-of-day> sharp", -3.4965075614664802),
-                                    ("hour", -1.1611326456494435), ("minute", -1.7619065060783738)],
-                               n = 46},
-                   koData =
-                     ClassData{prior = -1.455287232606842, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.8472978603872037),
-                                    ("hour", -0.8472978603872037)],
-                               n = 14}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        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}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.3313571359544425, unseen = -4.189654742026425,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -3.481240089335692),
-                                    ("the <day-of-month> (non ordinal)", -3.0757749812275272),
-                                    ("<day-of-month>(ordinal) <named-month>", -2.228477120840324),
-                                    ("day", -0.807091439909163),
-                                    ("the <day-of-month> (ordinal)", -3.481240089335692),
-                                    ("named-day", -1.8718021769015913),
-                                    ("<day-of-month> (ordinal)", -1.8718021769015913)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -1.2656663733312759,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.3353749158170367),
-                                    ("time-of-day (latent)", -1.1314021114911006),
-                                    ("hour", -0.9490805546971459)],
-                               n = 11}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.9808292530117262),
-                                    ("hh:mmhh:mm", -0.9808292530117262)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 2}}),
-       ("between <datetime> and <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("hh:mmhh:mm", -1.0986122886681098)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
-                                    ("minuteminute", -1.7047480922384253),
-                                    ("minutehour", -1.2992829841302609),
-                                    ("hh:mmintersect", -1.7047480922384253)],
-                               n = 3}}),
-       ("month (grain)",
-        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}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -1.252762968495368),
-                                    ("integer (0..19)minute (grain)", -1.252762968495368),
-                                    ("minute", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        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}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.10536051565782628,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -2.3025850929940455,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
-                                    ("quarter", -0.8472978603872037),
-                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
-                                    ("quarter", -0.8472978603872037),
-                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
-                               n = 2}}),
-       ("Last year",
-        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.4392032477400145, unseen = -5.860786223465865,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.0661736852554045),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.0661736852554045),
-                                    ("hourday", -5.1647859739235145),
-                                    ("dayhour", -2.9134941753170187),
-                                    ("daymonth", -2.9134941753170187),
-                                    ("monthyear", -3.0853444322436783),
-                                    ("intersecthh:mm", -5.1647859739235145),
-                                    ("the <day-of-month> (ordinal)named-month", -3.912023005428146),
-                                    ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -4.75932086581535),
-                                    ("last <day-of-week> of <time>year", -4.75932086581535),
-                                    ("todayat <time-of-day>", -4.75932086581535),
-                                    ("dayday", -3.0247198104272432),
-                                    ("dd/mmat <time-of-day>", -4.248495242049359),
-                                    ("intersect by \",\"hh:mm", -4.248495242049359),
-                                    ("intersectnamed-month", -4.75932086581535),
-                                    ("dayyear", -3.2929837970219227),
-                                    ("named-daythis <time>", -4.0661736852554045),
-                                    ("tomorrow<time-of-day> sharp", -4.75932086581535),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.75932086581535),
-                                    ("named-day<time> timezone", -4.471638793363569),
-                                    ("named-monthyear", -3.0853444322436783),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("on <date>named-month", -3.912023005428146),
-                                    ("tomorrowuntil <time-of-day>", -4.75932086581535),
-                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.471638793363569),
-                                    ("after <time-of-day>at <time-of-day>", -4.75932086581535),
-                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -4.75932086581535),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -5.1647859739235145),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -5.1647859739235145),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -4.75932086581535),
-                                    ("named-daynext <cycle>", -5.1647859739235145),
-                                    ("named-dayintersect", -4.75932086581535),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.75932086581535),
-                                    ("tomorrowafter <time-of-day>", -4.75932086581535),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.248495242049359),
-                                    ("dayminute", -2.8134107167600364),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -4.471638793363569),
-                                    ("<ordinal> <cycle> of <time>year", -4.75932086581535),
-                                    ("minuteday", -2.5620962884791303),
-                                    ("absorption of , after named dayintersect",
-                                     -5.1647859739235145),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.1647859739235145),
-                                    ("named-dayon <date>", -4.75932086581535),
-                                    ("named-dayat <time-of-day>", -4.75932086581535),
-                                    ("yearhh:mm", -5.1647859739235145),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -5.1647859739235145),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -4.75932086581535),
-                                    ("dd/mmyear", -4.75932086581535),
-                                    ("at <time-of-day>on <date>", -5.1647859739235145),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -5.1647859739235145),
-                                    ("between <datetime> and <datetime> (interval)on <date>",
-                                     -5.1647859739235145),
-                                    ("dayweek", -4.0661736852554045),
-                                    ("weekyear", -4.248495242049359),
-                                    ("hh:mmtomorrow", -4.471638793363569),
-                                    ("tomorrowat <time-of-day>", -3.912023005428146),
-                                    ("named-daythis <cycle>", -4.471638793363569),
-                                    ("named-daythe <day-of-month> (ordinal)", -5.1647859739235145),
-                                    ("at <time-of-day>tomorrow", -4.75932086581535),
-                                    ("last <cycle> of <time>year", -4.248495242049359),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.75932086581535),
-                                    ("yearminute", -5.1647859739235145)],
-                               n = 136},
-                   koData =
-                     ClassData{prior = -1.034370019939756, unseen = -5.43372200355424,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -4.736198448394496),
-                                    ("dayhour", -3.2321210516182215),
-                                    ("daymonth", -2.133508762950112),
-                                    ("monthday", -3.8199077165203406),
-                                    ("monthyear", -3.8199077165203406),
-                                    ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -3.4834354798991276),
-                                    ("named-dayhh:mm", -4.736198448394496),
-                                    ("dd/mmat <time-of-day>", -3.8199077165203406),
-                                    ("hourhour", -3.4834354798991276),
-                                    ("dayyear", -3.4834354798991276),
-                                    ("named-daythis <time>", -2.596132284898225),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -4.330733340286331),
-                                    ("minutemonth", -4.330733340286331),
-                                    ("named-monthyear", -3.8199077165203406),
-                                    ("in|during the <part-of-day>until <time-of-day>",
-                                     -4.330733340286331),
-                                    ("absorption of , after named daynamed-month",
-                                     -3.6375861597263857),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -4.736198448394496),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -4.330733340286331),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.736198448394496),
-                                    ("until <time-of-day>on <date>", -4.736198448394496),
-                                    ("dayminute", -3.349904087274605),
-                                    ("minuteday", -3.2321210516182215),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.736198448394496),
-                                    ("named-dayon <date>", -4.736198448394496),
-                                    ("named-dayat <time-of-day>", -3.8199077165203406),
-                                    ("hh:mmon <date>", -3.349904087274605),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.736198448394496),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -3.8199077165203406),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -3.8199077165203406),
-                                    ("this <part-of-day>until <time-of-day>", -4.330733340286331),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -4.330733340286331),
-                                    ("tomorrownoon", -4.736198448394496),
-                                    ("this <time>until <time-of-day>", -4.330733340286331),
-                                    ("minuteyear", -4.330733340286331),
-                                    ("yearminute", -4.330733340286331)],
-                               n = 75}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7346010553881064),
-                                    ("ordinals (first..31st)week (grain)intersect",
-                                     -1.7346010553881064),
-                                    ("ordinals (first..31st)week (grain)named-month",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.2237754316221157),
-                                    ("ordinals (first..31st)day (grain)named-month",
-                                     -1.7346010553881064)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("season",
-        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}}),
-       ("year (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}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.8754687373538999, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.2237754316221157),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1400661634962708),
-                                    ("hh:mmhh:mm", -1.2237754316221157),
-                                    ("hourhour", -2.1400661634962708)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.5389965007326869,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.4350845252893227),
-                                    ("minuteminute", -1.6582280766035324),
-                                    ("minutehour", -1.4350845252893227),
-                                    ("hh:mmintersect", -1.6582280766035324)],
-                               n = 7}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003),
-                                    ("month (grain)", -2.3025850929940455),
-                                    ("year (grain)", -2.3025850929940455),
-                                    ("week (grain)", -1.6094379124341003),
-                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
-                                    ("month", -2.3025850929940455),
-                                    ("quarter (grain)", -2.3025850929940455)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               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.6061358035703156,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
-       ("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 = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3}}),
-       ("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.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)quarter (grain)year",
-                                     -1.252762968495368),
-                                    ("quarteryear", -0.8472978603872037),
-                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after lunch",
-        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}}),
-       ("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}}),
-       ("the <cycle> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (grain)christmas eve", -0.6931471805599453),
-                                    ("yearday", -0.6931471805599453)],
-                               n = 2}}),
-       ("quarter to|till|before <integer> (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}}),
-       ("a pair",
-        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> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7472144018302211),
-                                    ("ordinals (first..31st)named-dayintersect",
-                                     -0.9985288301111273),
-                                    ("ordinals (first..31st)named-daynamed-month",
-                                     -1.845826690498331)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7621400520468967),
-                                    ("ordinals (first..31st)named-daynamed-month",
-                                     -0.7621400520468967)],
-                               n = 6}}),
-       ("the <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..31st)",
-        Classifier{okData =
-                     ClassData{prior = -5.129329438755058e-2,
-                               unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
-                   koData =
-                     ClassData{prior = -2.995732273553991, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.189654742026425,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 64},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (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}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8472978603872037), ("evening", -1.252762968495368),
-                                    ("morning", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7308875085427924),
-                                    ("morning", -0.7308875085427924)],
-                               n = 12}}),
-       ("christmas 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}}),
-       ("<day-of-month>(ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -9.53101798043249e-2,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -1.749199854809259),
-                                    ("ordinal (digits)named-month", -1.0560526742493137),
-                                    ("month", -0.7375989431307791)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -2.3978952727983707, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -0.916290731874155),
-                                    ("month", -0.916290731874155)],
-                               n = 1}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 23}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("afternoon", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("evening", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7672551527136672),
-                                    ("morning", -0.7672551527136672)],
-                               n = 12}}),
-       ("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.0, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (grain)christmas eve", -0.6931471805599453),
-                                    ("yearday", -0.6931471805599453)],
-                               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}}),
-       ("<time> after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)", -1.0116009116784799),
-                                    ("ordinal (digits)", -0.45198512374305727)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("afternoon",
-        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> from now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("second", -1.4469189829363254), ("year", -2.1400661634962708),
-                                    ("<integer> <unit-of-duration>", -1.2237754316221157),
-                                    ("a <unit-of-duration>", -1.7346010553881064),
-                                    ("minute", -1.7346010553881064)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5686159179138452),
-                                    ("year (grain)", -2.0794415416798357),
-                                    ("week (grain)", -1.5686159179138452),
-                                    ("day", -2.4849066497880004), ("quarter", -2.4849066497880004),
-                                    ("year", -2.0794415416798357),
-                                    ("quarter (grain)", -2.4849066497880004),
-                                    ("day (grain)", -2.4849066497880004)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -2.1972245773362196,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.6094379124341003),
-                                    ("day (grain)", -1.6094379124341003)],
-                               n = 1}}),
-       ("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}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.3862943611198906),
-                                    ("hour", -1.3862943611198906),
-                                    ("<hour-of-day> half (as relative minutes)",
-                                     -1.3862943611198906),
-                                    ("minute", -1.3862943611198906)],
-                               n = 4}}),
-       ("christmas days",
-        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}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.99714282850325, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)", -2.5317807984289897e-2)],
-                               n = 38},
-                   koData =
-                     ClassData{prior = -0.46034171833399856,
-                               unseen = -4.219507705176107,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.27286698666664033),
-                                    ("integer (0..19)", -1.4321038971511848)],
-                               n = 65}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.1431008436406733, unseen = -3.332204510175204,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -2.0149030205422647, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.0986122886681098),
-                                    ("daymonth", -0.7621400520468967),
-                                    ("named-dayintersect", -1.6094379124341003)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.579818495252942, unseen = -4.672828834461907,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.466214516775848),
-                                    ("integer (0..19)year (grain)", -3.5648268054439574),
-                                    ("integer (numeric)day (grain)", -2.871679624884012),
-                                    ("integer (0..19)hour (grain)", -3.970291913552122),
-                                    ("second", -3.2771447329921766),
-                                    ("integer (numeric)second (grain)", -3.970291913552122),
-                                    ("a pairhour (grain)", -3.970291913552122),
-                                    ("integer (numeric)year (grain)", -3.5648268054439574),
-                                    ("day", -2.2655438213136967), ("year", -3.054001181677967),
-                                    ("integer (numeric)week (grain)", -3.2771447329921766),
-                                    ("integer (0..19)month (grain)", -3.970291913552122),
-                                    ("integer (0..19)second (grain)", -3.5648268054439574),
-                                    ("hour", -2.871679624884012), ("month", -3.5648268054439574),
-                                    ("integer (numeric)minute (grain)", -2.717528945056754),
-                                    ("integer (0..19)minute (grain)", -3.054001181677967),
-                                    ("integer (numeric)month (grain)", -3.970291913552122),
-                                    ("minute", -2.2655438213136967),
-                                    ("integer (numeric)hour (grain)", -3.2771447329921766),
-                                    ("integer (0..19)day (grain)", -2.871679624884012),
-                                    ("integer (0..19)week (grain)", -2.871679624884012)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -0.8209805520698302, unseen = -4.48863636973214,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6855773452501515),
-                                    ("integer (0..19)year (grain)", -3.378724525810097),
-                                    ("integer (numeric)day (grain)", -3.0910424533583156),
-                                    ("integer (0..19)hour (grain)", -3.784189633918261),
-                                    ("second", -2.867898902044106),
-                                    ("integer (numeric)second (grain)", -3.378724525810097),
-                                    ("integer (numeric)year (grain)", -3.0910424533583156),
-                                    ("day", -2.6855773452501515), ("year", -2.6855773452501515),
-                                    ("integer (numeric)week (grain)", -3.378724525810097),
-                                    ("integer (0..19)month (grain)", -3.0910424533583156),
-                                    ("integer (0..19)second (grain)", -3.378724525810097),
-                                    ("hour", -2.6855773452501515), ("month", -2.6855773452501515),
-                                    ("integer (numeric)minute (grain)", -3.378724525810097),
-                                    ("integer (0..19)minute (grain)", -3.378724525810097),
-                                    ("integer (numeric)month (grain)", -3.378724525810097),
-                                    ("minute", -2.867898902044106),
-                                    ("integer (numeric)hour (grain)", -2.867898902044106),
-                                    ("integer (0..19)day (grain)", -3.378724525810097),
-                                    ("integer (0..19)week (grain)", -3.0910424533583156)],
-                               n = 33}}),
-       ("<duration> after <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>christmas eve", -1.0986122886681098),
-                                    ("yearday", -0.8109302162163288),
-                                    ("<integer> <unit-of-duration>christmas eve",
-                                     -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("integer (numeric)time-of-day (latent)", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.367123614131617),
-                                    ("year (grain)", -2.367123614131617),
-                                    ("second", -1.8562979903656263),
-                                    ("week (grain)", -2.367123614131617),
-                                    ("day", -2.772588722239781),
-                                    ("minute (grain)", -2.367123614131617),
-                                    ("year", -2.367123614131617),
-                                    ("second (grain)", -1.8562979903656263),
-                                    ("minute", -2.367123614131617),
-                                    ("day (grain)", -2.772588722239781)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.1590646946296874, unseen = -4.442651256490317,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>named-day", -3.7376696182833684),
-                                    ("intersect by \",\"year", -3.7376696182833684),
-                                    ("hh:mmintersect by \",\"", -3.7376696182833684),
-                                    ("dayday", -2.032921526044943),
-                                    ("hh:mmnamed-day", -3.7376696182833684),
-                                    ("named-dayintersect by \",\"", -3.332204510175204),
-                                    ("dayyear", -2.8213788864092133),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -3.7376696182833684),
-                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -3.332204510175204),
-                                    ("<named-month> <day-of-month> (non ordinal)named-day",
-                                     -3.7376696182833684),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -3.044522437723423),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -2.639057329615259),
-                                    ("hh:mmintersect", -3.7376696182833684),
-                                    ("intersect by \",\"intersect", -3.7376696182833684),
-                                    ("named-dayintersect", -3.7376696182833684),
-                                    ("at <time-of-day>intersect", -3.7376696182833684),
-                                    ("dayminute", -2.639057329615259),
-                                    ("intersectyear", -3.7376696182833684),
-                                    ("minuteday", -2.032921526044943),
-                                    ("hh:mmabsorption of , after named day", -3.7376696182833684),
-                                    ("at <time-of-day>intersect by \",\"", -3.7376696182833684),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -3.7376696182833684),
-                                    ("intersectintersect", -3.7376696182833684),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -3.332204510175204)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -1.916922612182061, unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.791759469228055),
-                                    ("daymonth", -1.791759469228055)],
-                               n = 5}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -2.197890671877523e-2,
-                               unseen = -3.8501476017100584,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 45},
-                   koData =
-                     ClassData{prior = -3.828641396489095, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <integer> (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}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.290459441148391,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 71},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (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}}),
-       ("<time-of-day> sharp",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.2992829841302609),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.4816045409242156),
-                                    ("daymonth", -1.1451323043030026),
-                                    ("named-daylast <cycle>", -2.3978952727983707),
-                                    ("named-daynext <cycle>", -2.3978952727983707),
-                                    ("named-dayintersect", -1.9924301646902063),
-                                    ("dayweek", -1.9924301646902063)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.329135947279942),
-                                    ("daymonth", -0.8183103235139514),
-                                    ("named-dayintersect", -1.580450375560848)],
-                               n = 14}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.580450375560848), ("day", -1.916922612182061),
-                                    ("year", -2.4277482359480516),
-                                    ("<integer> <unit-of-duration>", -0.8873031950009028),
-                                    ("a <unit-of-duration>", -2.833213344056216),
-                                    ("month", -2.4277482359480516)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.6739764335716716,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.2809338454620642),
-                                    ("named-day", -1.2809338454620642),
-                                    ("hour", -1.791759469228055), ("week-end", -1.791759469228055)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.2076393647782445, unseen = -4.07753744390572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.8632184332102),
-                                    ("time-of-day (latent)", -1.1160040313799788),
-                                    ("named-day", -2.451005098112319),
-                                    ("intersect by \"of\", \"from\", \"'s\"", -2.451005098112319),
-                                    ("hour", -1.1160040313799788)],
-                               n = 26}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)", -1.0116009116784799),
-                                    ("ordinal (digits)", -0.45198512374305727)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the day after tomorrow",
-        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}}),
-       ("noon",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -0.8873031950009028),
-                                    ("hour", -0.8873031950009028)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.5040773967762742),
-                                    ("hh:mm", -1.5040773967762742),
-                                    ("minute", -1.0986122886681098)],
-                               n = 2}}),
-       ("<integer> and an half hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.6931471805599453),
-                                    ("integer (0..19)", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("evening",
-        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}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.7047480922384253),
-                                    ("month (grain)", -1.9924301646902063),
-                                    ("year (grain)", -1.9924301646902063),
-                                    ("week (grain)", -1.7047480922384253),
-                                    ("year", -1.9924301646902063), ("month", -1.9924301646902063)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.0116009116784799, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716),
-                                    ("week (grain)", -1.6739764335716716),
-                                    ("day", -1.6739764335716716),
-                                    ("day (grain)", -1.6739764335716716)],
-                               n = 4}}),
-       ("christmas",
-        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 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}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.793208009442517),
-                                    ("integer (0..19)year (grain)", -3.1986731175506815),
-                                    ("integer (numeric)day (grain)", -3.1986731175506815),
-                                    ("integer (0..19)hour (grain)", -3.1986731175506815),
-                                    ("second", -2.793208009442517),
-                                    ("integer (numeric)second (grain)", -3.1986731175506815),
-                                    ("integer (numeric)year (grain)", -3.1986731175506815),
-                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
-                                    ("integer (numeric)week (grain)", -3.1986731175506815),
-                                    ("integer (0..19)month (grain)", -3.1986731175506815),
-                                    ("integer (0..19)second (grain)", -3.1986731175506815),
-                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
-                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
-                                    ("integer (0..19)minute (grain)", -3.1986731175506815),
-                                    ("integer (numeric)month (grain)", -3.1986731175506815),
-                                    ("minute", -2.793208009442517),
-                                    ("integer (numeric)hour (grain)", -3.1986731175506815),
-                                    ("integer (0..19)day (grain)", -3.1986731175506815),
-                                    ("integer (0..19)week (grain)", -3.1986731175506815)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.418840607796598,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.0204248861443626),
-                                    ("<integer> more <unit-of-duration>", -3.3081069585961433),
-                                    ("number.number hours", -3.713572066704308),
-                                    ("second", -2.797281334830153), ("day", -2.6149597780361984),
-                                    ("half an hour", -3.713572066704308),
-                                    ("<integer> <unit-of-duration>", -1.3156767939059373),
-                                    ("a <unit-of-duration>", -2.46080909820894),
-                                    ("<integer> and an half hours", -3.3081069585961433),
-                                    ("hour", -2.6149597780361984), ("minute", -1.4622802680978126),
-                                    ("about <duration>", -3.3081069585961433)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.8362480242006186,
-                               unseen = -3.6888794541139363,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.466337068793427),
-                                    ("hh:mmhh:mm", -1.466337068793427),
-                                    ("dayday", -1.8718021769015913),
-                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
-                                     -1.8718021769015913)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -0.5679840376059393, unseen = -3.871201010907891,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -2.0583881324820035),
-                                    ("minuteminute", -1.9042374526547454),
-                                    ("hh:mmhh:mm", -3.1570004211501135),
-                                    ("dayyear", -2.751535313041949),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -2.751535313041949),
-                                    ("hh:mmintersect", -2.0583881324820035),
-                                    ("dd/mmyear", -2.751535313041949),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -2.0583881324820035),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -2.751535313041949),
-                                    ("minuteyear", -2.751535313041949),
-                                    ("yearminute", -2.751535313041949)],
-                               n = 17}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.7985076962177716),
-                                    ("hh:mmhh:mm", -0.7985076962177716)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.8754687373538999),
-                                    ("minuteminute", -2.4849066497880004),
-                                    ("hh:mmhh:mm", -2.4849066497880004),
-                                    ("minutehour", -0.8754687373538999)],
-                               n = 10}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("integer (0..19)year (grain)", -3.332204510175204),
-                                    ("integer (numeric)day (grain)", -2.9267394020670396),
-                                    ("second", -2.9267394020670396),
-                                    ("integer (numeric)second (grain)", -3.332204510175204),
-                                    ("integer (numeric)year (grain)", -2.9267394020670396),
-                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
-                                    ("integer (numeric)week (grain)", -3.332204510175204),
-                                    ("integer (0..19)month (grain)", -2.9267394020670396),
-                                    ("integer (0..19)second (grain)", -3.332204510175204),
-                                    ("hour", -2.9267394020670396), ("month", -2.639057329615259),
-                                    ("integer (numeric)minute (grain)", -3.332204510175204),
-                                    ("integer (0..19)minute (grain)", -3.332204510175204),
-                                    ("integer (numeric)month (grain)", -3.332204510175204),
-                                    ("minute", -2.9267394020670396),
-                                    ("integer (numeric)hour (grain)", -2.9267394020670396),
-                                    ("integer (0..19)day (grain)", -3.332204510175204),
-                                    ("integer (0..19)week (grain)", -2.9267394020670396)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 5}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 3}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3}}),
-       ("<hour-of-day> half (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about <time-of-day>", -1.7346010553881064),
-                                    ("time-of-day (latent)", -1.041453874828161),
-                                    ("hour", -0.7537718023763802)],
-                               n = 7}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter (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}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.4816045409242156),
-                                    ("week (grain)named-month", -1.9924301646902063),
-                                    ("day (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.4816045409242156),
-                                    ("day (grain)named-month", -1.9924301646902063),
-                                    ("week (grain)intersect", -1.9924301646902063)],
-                               n = 8},
-                   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 = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -1.0986122886681098),
-                                    ("ordinal (digits)named-month", -1.5040773967762742),
-                                    ("month", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("morning",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("week-end",
-        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}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.7537718023763802, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.6863989535702288),
-                                    ("intersect", -2.1972245773362196),
-                                    ("tomorrow", -2.1972245773362196), ("day", -2.1972245773362196),
-                                    ("hour", -1.349926716949016)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.6359887667199967,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("this <part-of-day>", -2.268683541318364),
-                                    ("christmas eve", -2.268683541318364),
-                                    ("in|during the <part-of-day>", -2.268683541318364),
-                                    ("day", -2.268683541318364), ("hh:mm", -2.6741486494265287),
-                                    ("hour", -1.4213856809311607), ("minute", -2.6741486494265287),
-                                    ("this <time>", -2.268683541318364)],
-                               n = 9}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = -4.8790164169432056e-2,
-                               unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
-                   koData =
-                     ClassData{prior = -3.044522437723423, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (numeric)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 9}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2443240998495033,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.1354942159291497),
-                                    ("intersect", -2.7300291078209855),
-                                    ("season", -2.2192034840549946),
-                                    ("next <cycle>", -3.1354942159291497),
-                                    ("named-month", -2.7300291078209855),
-                                    ("day", -1.8827312474337816),
-                                    ("christmas days", -2.7300291078209855),
-                                    ("hour", -1.8827312474337816), ("evening", -3.1354942159291497),
-                                    ("month", -2.2192034840549946),
-                                    ("morning", -3.1354942159291497),
-                                    ("week-end", -2.2192034840549946)],
-                               n = 17},
-                   koData =
-                     ClassData{prior = -0.3398678256223512, unseen = -4.574710978503383,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.9993988340062996),
-                                    ("named-month", -1.6199092123013958),
-                                    ("hour", -1.9993988340062996), ("month", -1.1303609869826898),
-                                    ("morning", -1.9993988340062996)],
-                               n = 42}}),
-       ("within <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/NB_XX.hs b/Duckling/Ranking/Classifiers/NB_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/NB_XX.hs
@@ -0,0 +1,1700 @@
+-- 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.NB_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("L\248rdag",
+        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}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.4350845252893227),
+                                    ("<time-of-day> o'clock", -2.3513752571634776),
+                                    ("hh:mm", -1.6582280766035324), ("hour", -1.6582280766035324),
+                                    ("minute", -1.252762968495368)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.7546493803177391, unseen = -4.912654885736052,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 134},
+                   koData =
+                     ClassData{prior = -0.6352093434537263, unseen = -5.030437921392435,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 151}}),
+       ("the day before yesterday",
+        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}}),
+       ("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}}),
+       ("lunch",
+        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}}),
+       ("S\248ndag",
+        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}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.0986122886681098),
+                                    ("tomorrowevening", -2.0149030205422647),
+                                    ("tomorrowlunch", -2.0149030205422647),
+                                    ("yesterdayevening", -2.0149030205422647),
+                                    ("Mandagmorning", -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -1.1786549963416462),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -1.1786549963416462)],
+                               n = 3}}),
+       ("dd/mm",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("today",
+        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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2657031657330056, unseen = -4.605170185988091,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.4965075614664802),
+                                    ("time-of-day (latent)", -1.2278240201481159),
+                                    ("relative minutes after|past <integer> (hour-of-day)",
+                                     -3.4965075614664802),
+                                    ("hh:mm", -2.030170492673053),
+                                    ("<time-of-day> sharp", -3.4965075614664802),
+                                    ("hour", -1.1611326456494435), ("minute", -1.7619065060783738)],
+                               n = 46},
+                   koData =
+                     ClassData{prior = -1.455287232606842, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.8472978603872037),
+                                    ("hour", -0.8472978603872037)],
+                               n = 14}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("L\248rdag", -2.3978952727983707),
+                                    ("S\248ndag", -2.3978952727983707),
+                                    ("Mandag", -1.7047480922384253), ("day", -0.8938178760220964),
+                                    ("Onsdag", -2.3978952727983707),
+                                    ("Fredag", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        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}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.3313571359544425, unseen = -4.219507705176107,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("L\248rdag", -3.5115454388310208),
+                                    ("on <date>", -3.5115454388310208),
+                                    ("Mandag", -3.5115454388310208), ("Torsdag", -2.12525107771113),
+                                    ("the <day-of-month> (non ordinal)", -3.1060803307228566),
+                                    ("<day-of-month>(ordinal) <named-month>", -2.2587824703356527),
+                                    ("day", -0.8373967894044921),
+                                    ("the <day-of-month> (ordinal)", -3.5115454388310208),
+                                    ("<day-of-month> (ordinal)", -1.9021075263969205)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -1.2656663733312759,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -2.3978952727983707),
+                                    ("time-of-day (latent)", -1.1939224684724346),
+                                    ("hour", -1.0116009116784799)],
+                               n = 11}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.13005312824819779,
+                               unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
+                   koData =
+                     ClassData{prior = -2.1041341542702074,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.9808292530117262),
+                                    ("hh:mmhh:mm", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
+                                    ("minutehour", -0.9808292530117262)],
+                               n = 2}}),
+       ("between <datetime> and <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("hh:mmhh:mm", -1.0986122886681098)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
+                                    ("minuteminute", -1.7047480922384253),
+                                    ("minutehour", -1.2992829841302609),
+                                    ("hh:mmintersect", -1.7047480922384253)],
+                               n = 3}}),
+       ("month (grain)",
+        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}}),
+       ("<integer> more <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)", -1.252762968495368),
+                                    ("integer (0..19)minute (grain)", -1.252762968495368),
+                                    ("minute", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> o'clock",
+        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}}),
+       ("Juli",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.10536051565782628,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -2.3025850929940455,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
+                                    ("quarter", -0.8472978603872037),
+                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
+                                    ("quarter", -0.8472978603872037),
+                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
+                               n = 2}}),
+       ("Last year",
+        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.4103550934023561, unseen = -5.877735781779639,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Onsdagthis <cycle>", -5.181783550292085),
+                                    ("Torsdag<time> timezone", -4.48863636973214),
+                                    ("<datetime> - <datetime> (interval)on <date>",
+                                     -4.083171261623976),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.083171261623976),
+                                    ("hourday", -5.181783550292085), ("dayhour", -2.93049175168559),
+                                    ("daymonth", -2.93049175168559),
+                                    ("monthyear", -3.1023420086122493),
+                                    ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
+                                     -5.181783550292085),
+                                    ("Mandagon <date>", -4.77631844218392),
+                                    ("intersecthh:mm", -5.181783550292085),
+                                    ("Torsdagbetween <datetime> and <datetime> (interval)",
+                                     -5.181783550292085),
+                                    ("Torsdagat <time-of-day>", -4.77631844218392),
+                                    ("on <date>Februar", -4.77631844218392),
+                                    ("Marsyear", -4.77631844218392),
+                                    ("intersect by \"of\", \"from\", \"'s\"year",
+                                     -4.77631844218392),
+                                    ("Oktoberyear", -3.572345637857985),
+                                    ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.77631844218392),
+                                    ("Torsdagfrom <datetime> - <datetime> (interval)",
+                                     -4.77631844218392),
+                                    ("Mandagintersect", -4.77631844218392),
+                                    ("last <day-of-week> of <time>year", -4.77631844218392),
+                                    ("intersectFebruar", -4.77631844218392),
+                                    ("todayat <time-of-day>", -4.77631844218392),
+                                    ("dayday", -3.0417173867958143),
+                                    ("dd/mmat <time-of-day>", -4.26549281841793),
+                                    ("intersect by \",\"hh:mm", -4.26549281841793),
+                                    ("dayyear", -3.3099813733904937),
+                                    ("tomorrow<time-of-day> sharp", -4.77631844218392),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -4.77631844218392),
+                                    ("Onsdag<named-month> <day-of-month> (non ordinal)",
+                                     -5.181783550292085),
+                                    ("Onsdagthis <time>", -4.48863636973214),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.083171261623976),
+                                    ("tomorrowuntil <time-of-day>", -4.77631844218392),
+                                    ("S\248ndag<day-of-month> (non ordinal) <named-month>",
+                                     -5.181783550292085),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -4.48863636973214),
+                                    ("the <day-of-month> (ordinal)Februar", -4.77631844218392),
+                                    ("after <time-of-day>at <time-of-day>", -4.77631844218392),
+                                    ("the <day-of-month> (ordinal)Mars", -4.26549281841793),
+                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
+                                     -4.77631844218392),
+                                    ("Mandagthe <day-of-month> (ordinal)", -5.181783550292085),
+                                    ("Mandagthis <cycle>", -5.181783550292085),
+                                    ("Tirsdagthis <time>", -4.77631844218392),
+                                    ("tomorrowafter <time-of-day>", -4.77631844218392),
+                                    ("Tirsdagthis <cycle>", -5.181783550292085),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.26549281841793),
+                                    ("dayminute", -2.8304082931286074),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -4.48863636973214),
+                                    ("on <date>Mars", -4.26549281841793),
+                                    ("<ordinal> <cycle> of <time>year", -4.77631844218392),
+                                    ("minuteday", -2.5790938648477013),
+                                    ("absorption of , after named dayintersect",
+                                     -5.181783550292085),
+                                    ("yearhh:mm", -5.181783550292085),
+                                    ("Onsdagnext <cycle>", -5.181783550292085),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -4.77631844218392),
+                                    ("dd/mmyear", -4.77631844218392),
+                                    ("Septemberyear", -4.26549281841793),
+                                    ("at <time-of-day>on <date>", -5.181783550292085),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -5.181783550292085),
+                                    ("between <datetime> and <datetime> (interval)on <date>",
+                                     -5.181783550292085),
+                                    ("dayweek", -4.083171261623976),
+                                    ("weekyear", -4.26549281841793),
+                                    ("hh:mmtomorrow", -4.48863636973214),
+                                    ("tomorrowat <time-of-day>", -3.929020581796717),
+                                    ("at <time-of-day>tomorrow", -4.77631844218392),
+                                    ("last <cycle> of <time>year", -4.26549281841793),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -4.77631844218392),
+                                    ("yearminute", -5.181783550292085)],
+                               n = 136},
+                   koData =
+                     ClassData{prior = -1.0889034745411488, unseen = -5.407171771460119,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -3.20545280453606), ("daymonth", -2.10684051586795),
+                                    ("monthday", -3.7932394694381792),
+                                    ("monthyear", -3.7932394694381792),
+                                    ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
+                                     -4.709530201312334),
+                                    ("Mandagon <date>", -4.709530201312334),
+                                    ("Torsdagbetween <datetime> and <datetime> (interval)",
+                                     -4.709530201312334),
+                                    ("Torsdagat <time-of-day>", -3.7932394694381792),
+                                    ("absorption of , after named dayFebruar", -4.0163830207523885),
+                                    ("Marsyear", -4.0163830207523885),
+                                    ("intersect by \"of\", \"from\", \"'s\"year",
+                                     -3.4567672328169663),
+                                    ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.709530201312334),
+                                    ("Torsdagfrom <datetime> - <datetime> (interval)",
+                                     -4.709530201312334),
+                                    ("OnsdagFebruar", -4.709530201312334),
+                                    ("absorption of , after named dayJuli", -4.304065093204169),
+                                    ("dd/mmat <time-of-day>", -3.7932394694381792),
+                                    ("hourhour", -3.4567672328169663),
+                                    ("dayyear", -3.4567672328169663),
+                                    ("Onsdagthis <time>", -3.4567672328169663),
+                                    ("in|during the <part-of-day>until <time-of-day>",
+                                     -4.304065093204169),
+                                    ("Aprilyear", -4.709530201312334),
+                                    ("Tirsdagthis <time>", -3.7932394694381792),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -3.7932394694381792),
+                                    ("until <time-of-day>on <date>", -4.709530201312334),
+                                    ("August<day-of-month> (non ordinal) <named-month>",
+                                     -3.7932394694381792),
+                                    ("Torsdaghh:mm", -4.709530201312334),
+                                    ("dayminute", -3.3232358401924436),
+                                    ("minuteday", -3.20545280453606),
+                                    ("hh:mmon <date>", -3.3232358401924436),
+                                    ("this <part-of-day>until <time-of-day>", -4.304065093204169),
+                                    ("S\248ndagthis <time>", -3.7932394694381792),
+                                    ("tomorrownoon", -4.709530201312334),
+                                    ("this <time>until <time-of-day>", -4.304065093204169),
+                                    ("Mandagthis <time>", -4.304065093204169)],
+                               n = 69}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7346010553881064),
+                                    ("ordinals (first..31st)day (grain)Oktober",
+                                     -1.7346010553881064),
+                                    ("ordinals (first..31st)week (grain)intersect",
+                                     -1.7346010553881064),
+                                    ("weekmonth", -1.2237754316221157),
+                                    ("ordinals (first..31st)week (grain)Oktober",
+                                     -1.7346010553881064)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("season",
+        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}}),
+       ("year (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}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.8754687373538999, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.2237754316221157),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.1400661634962708),
+                                    ("hh:mmhh:mm", -1.2237754316221157),
+                                    ("hourhour", -2.1400661634962708)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.5389965007326869,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.4350845252893227),
+                                    ("minuteminute", -1.6582280766035324),
+                                    ("minutehour", -1.4350845252893227),
+                                    ("hh:mmintersect", -1.6582280766035324)],
+                               n = 7}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("month (grain)", -2.3025850929940455),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -1.6094379124341003),
+                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
+                                    ("month", -2.3025850929940455),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               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.6061358035703156,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hh:mmhh:mm", -1.0986122886681098),
+                                    ("hourhour", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
+                                    ("minutehour", -0.9808292530117262)],
+                               n = 5}}),
+       ("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 = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 3}}),
+       ("Mandag",
+        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.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.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)quarter (grain)year",
+                                     -1.252762968495368),
+                                    ("quarteryear", -0.8472978603872037),
+                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after lunch",
+        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}}),
+       ("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}}),
+       ("Torsdag",
+        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}}),
+       ("the <cycle> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (grain)christmas eve", -0.6931471805599453),
+                                    ("yearday", -0.6931471805599453)],
+                               n = 2}}),
+       ("quarter to|till|before <integer> (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}}),
+       ("a pair",
+        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> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8938178760220964),
+                                    ("ordinals (first..31st)TirsdagOktober", -1.9924301646902063),
+                                    ("ordinals (first..31st)Onsdagintersect", -1.4816045409242156),
+                                    ("ordinals (first..31st)Tirsdagintersect",
+                                     -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9444616088408514),
+                                    ("ordinals (first..31st)OnsdagOktober", -1.2809338454620642),
+                                    ("ordinals (first..31st)TirsdagSeptember", -1.791759469228055)],
+                               n = 6}}),
+       ("the <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..31st)",
+        Classifier{okData =
+                     ClassData{prior = -5.129329438755058e-2,
+                               unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                   koData =
+                     ClassData{prior = -2.995732273553991, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("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}}),
+       ("week (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}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8472978603872037), ("evening", -1.252762968495368),
+                                    ("morning", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7308875085427924),
+                                    ("morning", -0.7308875085427924)],
+                               n = 12}}),
+       ("christmas 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}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)Mars", -1.8325814637483102),
+                                    ("month", -0.8209805520698302),
+                                    ("ordinal (digits)Mars", -1.6094379124341003),
+                                    ("ordinal (digits)Februar", -1.8325814637483102)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)April", -1.252762968495368),
+                                    ("month", -1.252762968495368)],
+                               n = 1}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 23}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262),
+                                    ("evening", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7672551527136672),
+                                    ("morning", -0.7672551527136672)],
+                               n = 12}}),
+       ("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.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (grain)christmas eve", -0.6931471805599453),
+                                    ("yearday", -0.6931471805599453)],
+                               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}}),
+       ("<time> after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.1786549963416462), ("Mars", -1.8718021769015913),
+                                    ("month", -1.8718021769015913), ("Onsdag", -1.8718021769015913),
+                                    ("Fredag", -1.466337068793427)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)", -1.0116009116784799),
+                                    ("ordinal (digits)", -0.45198512374305727)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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> from now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second", -1.4469189829363254), ("year", -2.1400661634962708),
+                                    ("<integer> <unit-of-duration>", -1.2237754316221157),
+                                    ("a <unit-of-duration>", -1.7346010553881064),
+                                    ("minute", -1.7346010553881064)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.5686159179138452),
+                                    ("year (grain)", -2.0794415416798357),
+                                    ("week (grain)", -1.5686159179138452),
+                                    ("day", -2.4849066497880004), ("quarter", -2.4849066497880004),
+                                    ("year", -2.0794415416798357),
+                                    ("quarter (grain)", -2.4849066497880004),
+                                    ("day (grain)", -2.4849066497880004)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.6094379124341003),
+                                    ("day (grain)", -1.6094379124341003)],
+                               n = 1}}),
+       ("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}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.3862943611198906),
+                                    ("hour", -1.3862943611198906),
+                                    ("<hour-of-day> half (as relative minutes)",
+                                     -1.3862943611198906),
+                                    ("minute", -1.3862943611198906)],
+                               n = 4}}),
+       ("christmas days",
+        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}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.9057086225436182, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)", -2.5317807984289897e-2)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -0.5179430915348547, unseen = -4.07753744390572,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.27625337662815824),
+                                    ("integer (0..19)", -1.4213856809311607)],
+                               n = 56}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.1431008436406733, unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -2.0149030205422647, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8266785731844679),
+                                    ("S\248ndagMars", -1.6739764335716716),
+                                    ("S\248ndagintersect", -1.6739764335716716),
+                                    ("MandagMars", -1.6739764335716716)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.579818495252942, unseen = -4.672828834461907,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.466214516775848),
+                                    ("integer (0..19)year (grain)", -3.5648268054439574),
+                                    ("integer (numeric)day (grain)", -2.871679624884012),
+                                    ("integer (0..19)hour (grain)", -3.970291913552122),
+                                    ("second", -3.2771447329921766),
+                                    ("integer (numeric)second (grain)", -3.970291913552122),
+                                    ("a pairhour (grain)", -3.970291913552122),
+                                    ("integer (numeric)year (grain)", -3.5648268054439574),
+                                    ("day", -2.2655438213136967), ("year", -3.054001181677967),
+                                    ("integer (numeric)week (grain)", -3.2771447329921766),
+                                    ("integer (0..19)month (grain)", -3.970291913552122),
+                                    ("integer (0..19)second (grain)", -3.5648268054439574),
+                                    ("hour", -2.871679624884012), ("month", -3.5648268054439574),
+                                    ("integer (numeric)minute (grain)", -2.717528945056754),
+                                    ("integer (0..19)minute (grain)", -3.054001181677967),
+                                    ("integer (numeric)month (grain)", -3.970291913552122),
+                                    ("minute", -2.2655438213136967),
+                                    ("integer (numeric)hour (grain)", -3.2771447329921766),
+                                    ("integer (0..19)day (grain)", -2.871679624884012),
+                                    ("integer (0..19)week (grain)", -2.871679624884012)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -0.8209805520698302, unseen = -4.48863636973214,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6855773452501515),
+                                    ("integer (0..19)year (grain)", -3.378724525810097),
+                                    ("integer (numeric)day (grain)", -3.0910424533583156),
+                                    ("integer (0..19)hour (grain)", -3.784189633918261),
+                                    ("second", -2.867898902044106),
+                                    ("integer (numeric)second (grain)", -3.378724525810097),
+                                    ("integer (numeric)year (grain)", -3.0910424533583156),
+                                    ("day", -2.6855773452501515), ("year", -2.6855773452501515),
+                                    ("integer (numeric)week (grain)", -3.378724525810097),
+                                    ("integer (0..19)month (grain)", -3.0910424533583156),
+                                    ("integer (0..19)second (grain)", -3.378724525810097),
+                                    ("hour", -2.6855773452501515), ("month", -2.6855773452501515),
+                                    ("integer (numeric)minute (grain)", -3.378724525810097),
+                                    ("integer (0..19)minute (grain)", -3.378724525810097),
+                                    ("integer (numeric)month (grain)", -3.378724525810097),
+                                    ("minute", -2.867898902044106),
+                                    ("integer (numeric)hour (grain)", -2.867898902044106),
+                                    ("integer (0..19)day (grain)", -3.378724525810097),
+                                    ("integer (0..19)week (grain)", -3.0910424533583156)],
+                               n = 33}}),
+       ("<duration> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>christmas eve", -1.0986122886681098),
+                                    ("yearday", -0.8109302162163288),
+                                    ("<integer> <unit-of-duration>christmas eve",
+                                     -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("integer (numeric)time-of-day (latent)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Oktober",
+        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}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.367123614131617),
+                                    ("year (grain)", -2.367123614131617),
+                                    ("second", -1.8562979903656263),
+                                    ("week (grain)", -2.367123614131617),
+                                    ("day", -2.772588722239781),
+                                    ("minute (grain)", -2.367123614131617),
+                                    ("year", -2.367123614131617),
+                                    ("second (grain)", -1.8562979903656263),
+                                    ("minute", -2.367123614131617),
+                                    ("day (grain)", -2.772588722239781)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874, unseen = -4.51085950651685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("L\248rdag<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("intersect by \",\"year", -3.8066624897703196),
+                                    ("hh:mmintersect by \",\"", -3.8066624897703196),
+                                    ("dayday", -2.1019143975318944),
+                                    ("dayyear", -2.890371757896165),
+                                    ("at <time-of-day>L\248rdag", -3.8066624897703196),
+                                    ("<named-month> <day-of-month> (non ordinal)intersect",
+                                     -3.8066624897703196),
+                                    ("hh:mmL\248rdag", -3.8066624897703196),
+                                    ("Onsdag<named-month> <day-of-month> (non ordinal)",
+                                     -3.8066624897703196),
+                                    ("Fredagintersect by \",\"", -3.4011973816621555),
+                                    ("S\248ndag<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
+                                     -3.4011973816621555),
+                                    ("hh:mmintersect", -3.8066624897703196),
+                                    ("intersect by \",\"intersect", -3.8066624897703196),
+                                    ("at <time-of-day>intersect", -3.8066624897703196),
+                                    ("dayminute", -2.70805020110221),
+                                    ("intersectyear", -3.8066624897703196),
+                                    ("minuteday", -2.1019143975318944),
+                                    ("<named-month> <day-of-month> (non ordinal)Fredag",
+                                     -3.8066624897703196),
+                                    ("Fredag<named-month> <day-of-month> (non ordinal)",
+                                     -3.4011973816621555),
+                                    ("hh:mmabsorption of , after named day", -3.8066624897703196),
+                                    ("at <time-of-day>intersect by \",\"", -3.8066624897703196),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -3.8066624897703196),
+                                    ("intersectintersect", -3.8066624897703196),
+                                    ("Fredagintersect", -3.8066624897703196),
+                                    ("Mandag<named-month> <day-of-month> (non ordinal)",
+                                     -3.4011973816621555),
+                                    ("Mandag<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -3.4011973816621555)],
+                               n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.9459101490553135),
+                                    ("OnsdagFebruar", -3.044522437723423),
+                                    ("MandagFebruar", -2.639057329615259),
+                                    ("FredagJuli", -2.639057329615259)],
+                               n = 5}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -2.197890671877523e-2,
+                               unseen = -3.8501476017100584,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 45},
+                   koData =
+                     ClassData{prior = -3.828641396489095, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter after|past <integer> (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}}),
+       ("second (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}}),
+       ("<time-of-day> sharp",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.2992829841302609),
+                                    ("time-of-day (latent)", -1.2992829841302609),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mars",
+        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}}),
+       ("Februar",
+        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}}),
+       ("intersect by \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("OnsdagOktober", -2.2335922215070942),
+                                    ("TirsdagOktober", -2.2335922215070942),
+                                    ("S\248ndaglast <cycle>", -2.639057329615259),
+                                    ("Onsdagintersect", -2.2335922215070942),
+                                    ("Onsdagnext <cycle>", -2.639057329615259),
+                                    ("dayweek", -2.2335922215070942)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9808292530117262),
+                                    ("OnsdagOktober", -2.5902671654458267),
+                                    ("Tirsdagintersect", -2.5902671654458267),
+                                    ("TirsdagSeptember", -2.5902671654458267),
+                                    ("S\248ndagMars", -2.5902671654458267),
+                                    ("S\248ndagintersect", -2.5902671654458267),
+                                    ("Onsdagintersect", -2.5902671654458267),
+                                    ("MandagMars", -2.5902671654458267)],
+                               n = 14}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.580450375560848), ("day", -1.916922612182061),
+                                    ("year", -2.4277482359480516),
+                                    ("<integer> <unit-of-duration>", -0.8873031950009028),
+                                    ("a <unit-of-duration>", -2.833213344056216),
+                                    ("month", -2.4277482359480516)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.6739764335716716, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("S\248ndag", -1.8971199848858813),
+                                    ("day", -1.3862943611198906), ("hour", -1.8971199848858813),
+                                    ("Tirsdag", -1.8971199848858813),
+                                    ("week-end", -1.8971199848858813)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.2076393647782445, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("S\248ndag", -2.995732273553991),
+                                    ("Mandag", -2.995732273553991), ("day", -1.8971199848858813),
+                                    ("time-of-day (latent)", -1.1499055830556604),
+                                    ("intersect by \"of\", \"from\", \"'s\"", -2.4849066497880004),
+                                    ("hour", -1.1499055830556604)],
+                               n = 26}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)", -1.0116009116784799),
+                                    ("ordinal (digits)", -0.45198512374305727)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the day after tomorrow",
+        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}}),
+       ("noon",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -0.8873031950009028),
+                                    ("hour", -0.8873031950009028)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.5040773967762742),
+                                    ("hh:mm", -1.5040773967762742),
+                                    ("minute", -1.0986122886681098)],
+                               n = 2}}),
+       ("<integer> and an half hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.6931471805599453),
+                                    ("integer (0..19)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("evening",
+        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}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mandag", -2.0149030205422647), ("day", -1.3217558399823195),
+                                    ("Mars", -2.0149030205422647), ("month", -2.0149030205422647),
+                                    ("Onsdag", -2.0149030205422647),
+                                    ("Tirsdag", -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.3217558399823195), ("Mars", -2.0149030205422647),
+                                    ("month", -2.0149030205422647), ("Onsdag", -2.0149030205422647),
+                                    ("Fredag", -1.6094379124341003)],
+                               n = 4}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.7047480922384253),
+                                    ("month (grain)", -1.9924301646902063),
+                                    ("year (grain)", -1.9924301646902063),
+                                    ("week (grain)", -1.7047480922384253),
+                                    ("year", -1.9924301646902063), ("month", -1.9924301646902063)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.0116009116784799, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("day", -1.6739764335716716),
+                                    ("day (grain)", -1.6739764335716716)],
+                               n = 4}}),
+       ("Onsdag",
+        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}}),
+       ("christmas",
+        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 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}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.793208009442517),
+                                    ("integer (0..19)year (grain)", -3.1986731175506815),
+                                    ("integer (numeric)day (grain)", -3.1986731175506815),
+                                    ("integer (0..19)hour (grain)", -3.1986731175506815),
+                                    ("second", -2.793208009442517),
+                                    ("integer (numeric)second (grain)", -3.1986731175506815),
+                                    ("integer (numeric)year (grain)", -3.1986731175506815),
+                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
+                                    ("integer (numeric)week (grain)", -3.1986731175506815),
+                                    ("integer (0..19)month (grain)", -3.1986731175506815),
+                                    ("integer (0..19)second (grain)", -3.1986731175506815),
+                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
+                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
+                                    ("integer (0..19)minute (grain)", -3.1986731175506815),
+                                    ("integer (numeric)month (grain)", -3.1986731175506815),
+                                    ("minute", -2.793208009442517),
+                                    ("integer (numeric)hour (grain)", -3.1986731175506815),
+                                    ("integer (0..19)day (grain)", -3.1986731175506815),
+                                    ("integer (0..19)week (grain)", -3.1986731175506815)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Fredag",
+        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}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.418840607796598,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.0204248861443626),
+                                    ("<integer> more <unit-of-duration>", -3.3081069585961433),
+                                    ("number.number hours", -3.713572066704308),
+                                    ("second", -2.797281334830153), ("day", -2.6149597780361984),
+                                    ("half an hour", -3.713572066704308),
+                                    ("<integer> <unit-of-duration>", -1.3156767939059373),
+                                    ("a <unit-of-duration>", -2.46080909820894),
+                                    ("<integer> and an half hours", -3.3081069585961433),
+                                    ("hour", -2.6149597780361984), ("minute", -1.4622802680978126),
+                                    ("about <duration>", -3.3081069585961433)],
+                               n = 35},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("dayday", -1.791759469228055),
+                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
+                                     -1.791759469228055)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juli<day-of-month> (non ordinal) <named-month>",
+                                     -2.890371757896165),
+                                    ("monthday", -1.791759469228055),
+                                    ("minuteminute", -1.6376087894007967),
+                                    ("hh:mmhh:mm", -2.890371757896165),
+                                    ("dayyear", -2.4849066497880004),
+                                    ("hh:mmintersect", -1.791759469228055),
+                                    ("August<day-of-month> (non ordinal) <named-month>",
+                                     -1.9740810260220096),
+                                    ("dd/mmyear", -2.4849066497880004)],
+                               n = 13}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.7985076962177716),
+                                    ("hh:mmhh:mm", -0.7985076962177716)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.8754687373538999),
+                                    ("minuteminute", -2.4849066497880004),
+                                    ("hh:mmhh:mm", -2.4849066497880004),
+                                    ("minutehour", -0.8754687373538999)],
+                               n = 10}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.639057329615259),
+                                    ("integer (0..19)year (grain)", -3.332204510175204),
+                                    ("integer (numeric)day (grain)", -2.9267394020670396),
+                                    ("second", -2.9267394020670396),
+                                    ("integer (numeric)second (grain)", -3.332204510175204),
+                                    ("integer (numeric)year (grain)", -2.9267394020670396),
+                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
+                                    ("integer (numeric)week (grain)", -3.332204510175204),
+                                    ("integer (0..19)month (grain)", -2.9267394020670396),
+                                    ("integer (0..19)second (grain)", -3.332204510175204),
+                                    ("hour", -2.9267394020670396), ("month", -2.639057329615259),
+                                    ("integer (numeric)minute (grain)", -3.332204510175204),
+                                    ("integer (0..19)minute (grain)", -3.332204510175204),
+                                    ("integer (numeric)month (grain)", -3.332204510175204),
+                                    ("minute", -2.9267394020670396),
+                                    ("integer (numeric)hour (grain)", -2.9267394020670396),
+                                    ("integer (0..19)day (grain)", -3.332204510175204),
+                                    ("integer (0..19)week (grain)", -2.9267394020670396)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Februarinteger (numeric)", -1.3437347467010947),
+                                    ("Aprilinteger (numeric)", -2.4423470353692043),
+                                    ("month", -0.832909122935104),
+                                    ("Juliinteger (numeric)", -1.749199854809259)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -1.0986122886681098),
+                                    ("Aprilinteger (numeric)", -2.0149030205422647),
+                                    ("month", -0.916290731874155)],
+                               n = 5}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)September", -3.068052935133617),
+                                    ("integer (numeric)April", -3.068052935133617),
+                                    ("integer (numeric)August", -1.4586150226995167),
+                                    ("month", -0.8167611365271219),
+                                    ("integer (numeric)Juli", -2.662587827025453),
+                                    ("integer (numeric)Februar", -2.374905754573672),
+                                    ("integer (numeric)Mars", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -1.1786549963416462),
+                                    ("integer (numeric)Juli", -1.1786549963416462)],
+                               n = 3}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Mandag", -1.7047480922384253), ("day", -1.0116009116784799),
+                                    ("Onsdag", -1.7047480922384253),
+                                    ("Tirsdag", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.0116009116784799), ("Onsdag", -1.7047480922384253),
+                                    ("Fredag", -1.2992829841302609)],
+                               n = 3}}),
+       ("<hour-of-day> half (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about <time-of-day>", -1.7346010553881064),
+                                    ("time-of-day (latent)", -1.041453874828161),
+                                    ("hour", -0.7537718023763802)],
+                               n = 7}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter (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}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.4816045409242156),
+                                    ("day (grain)intersect", -1.9924301646902063),
+                                    ("weekmonth", -1.4816045409242156),
+                                    ("day (grain)Oktober", -1.9924301646902063),
+                                    ("week (grain)intersect", -1.9924301646902063),
+                                    ("week (grain)September", -1.9924301646902063)],
+                               n = 8},
+                   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 = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..31st)April", -1.6094379124341003),
+                                    ("ordinals (first..31st)Mars", -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)Mars", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tirsdag",
+        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}}),
+       ("morning",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("week-end",
+        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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.7537718023763802, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.6863989535702288),
+                                    ("intersect", -2.1972245773362196),
+                                    ("tomorrow", -2.1972245773362196), ("day", -2.1972245773362196),
+                                    ("hour", -1.349926716949016)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.6359887667199967,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this <part-of-day>", -2.268683541318364),
+                                    ("christmas eve", -2.268683541318364),
+                                    ("in|during the <part-of-day>", -2.268683541318364),
+                                    ("day", -2.268683541318364), ("hh:mm", -2.6741486494265287),
+                                    ("hour", -1.4213856809311607), ("minute", -2.6741486494265287),
+                                    ("this <time>", -2.268683541318364)],
+                               n = 9}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.8790164169432056e-2,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -3.044522437723423, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juli", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.2443240998495033, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.1780538303479458),
+                                    ("intersect", -2.772588722239781),
+                                    ("season", -2.2617630984737906),
+                                    ("next <cycle>", -3.1780538303479458),
+                                    ("day", -1.9252908618525775),
+                                    ("christmas days", -2.772588722239781),
+                                    ("Oktober", -2.772588722239781), ("hour", -1.9252908618525775),
+                                    ("evening", -3.1780538303479458),
+                                    ("month", -2.2617630984737906),
+                                    ("morning", -3.1780538303479458),
+                                    ("week-end", -2.2617630984737906)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.3398678256223512, unseen = -4.59511985013459,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("September", -2.9755295662364714),
+                                    ("intersect", -2.020018121209035),
+                                    ("Oktober", -2.187072205872201), ("Mars", -2.9755295662364714),
+                                    ("hour", -2.020018121209035), ("month", -1.1509802741854256),
+                                    ("morning", -2.020018121209035)],
+                               n = 42}}),
+       ("within <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August",
+        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}})]
diff --git a/Duckling/Ranking/Classifiers/NL.hs b/Duckling/Ranking/Classifiers/NL.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/NL.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.NL (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/NL_XX.hs b/Duckling/Ranking/Classifiers/NL_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/NL_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.NL_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/PL.hs b/Duckling/Ranking/Classifiers/PL.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/PL.hs
+++ /dev/null
@@ -1,2284 +0,0 @@
--- 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.PL (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("five",
-        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 (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.5997731097824868, unseen = -4.875197323201151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 129},
-                   koData =
-                     ClassData{prior = -0.7961464200320919, unseen = -4.68213122712422,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 106}}),
-       ("exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -1.3862943611198906),
-                                    ("<integer> (latent time-of-day)", -1.791759469228055),
-                                    ("hour", -0.8754687373538999),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("day (grain)yesterday", -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.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> <cycle> <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.120263536200091),
-                                    ("quarteryear", -2.5257286443082556),
-                                    ("third ordinalday (grain)on <date>", -2.5257286443082556),
-                                    ("first ordinalweek (grain)named-month", -2.5257286443082556),
-                                    ("weekmonth", -1.4271163556401458),
-                                    ("ordinal (digits)quarter (grain)year", -2.5257286443082556),
-                                    ("first ordinalweek (grain)intersect", -2.120263536200091),
-                                    ("third ordinalday (grain)named-month", -2.5257286443082556),
-                                    ("first ordinalweek (grain)on <date>", -2.120263536200091)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.7810085363512795, unseen = -4.948759890378168,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)after <time-of-day>", -3.5553480614894135),
-                                    ("dayhour", -2.995732273553991),
-                                    ("<ordinal> (as hour)evening|night", -2.5437471498109336),
-                                    ("<ordinal> (as hour)on <date>", -4.248495242049359),
-                                    ("yesterdayevening|night", -4.248495242049359),
-                                    ("hourhour", -1.180442306915742),
-                                    ("after <time-of-day>after <time-of-day>", -3.8430301339411947),
-                                    ("until <time-of-day>morning", -3.8430301339411947),
-                                    ("until <time-of-day>after <time-of-day>", -4.248495242049359),
-                                    ("minutehour", -4.248495242049359),
-                                    ("named-daymorning", -4.248495242049359),
-                                    ("todayevening|night", -4.248495242049359),
-                                    ("at <time-of-day>evening|night", -4.248495242049359),
-                                    ("named-dayevening|night", -4.248495242049359),
-                                    ("intersecton <date>", -4.248495242049359),
-                                    ("<integer> (latent time-of-day)this <part-of-day>",
-                                     -4.248495242049359),
-                                    ("hh:mmon <date>", -4.248495242049359),
-                                    ("<integer> (latent time-of-day)morning", -3.5553480614894135),
-                                    ("at <time-of-day>on <date>", -4.248495242049359),
-                                    ("intersectmorning", -3.1498829533812494),
-                                    ("<integer> (latent time-of-day)evening|night",
-                                     -2.995732273553991),
-                                    ("from <datetime> - <datetime> (interval)morning",
-                                     -4.248495242049359),
-                                    ("from <time-of-day> - <time-of-day> (interval)morning",
-                                     -4.248495242049359),
-                                    ("on <date>morning", -4.248495242049359),
-                                    ("at <time-of-day>morning", -3.8430301339411947),
-                                    ("tomorrowevening|night", -3.8430301339411947)],
-                               n = 49},
-                   koData =
-                     ClassData{prior = -0.6123858239154869,
-                               unseen = -5.0689042022202315,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.971552579668651),
-                                    ("yearhour", -1.9271008170978172),
-                                    ("year (latent)on <date>", -4.3694478524670215),
-                                    ("<day-of-month> (ordinal)on <date>", -4.3694478524670215),
-                                    ("<time-of-day> - <time-of-day> (interval)morning",
-                                     -4.3694478524670215),
-                                    ("<day-of-month> (ordinal)evening|night", -2.6646997602285962),
-                                    ("by the end of <time>morning", -4.3694478524670215),
-                                    ("year (latent)evening|night", -3.1166848839716534),
-                                    ("hourhour", -2.760009940032921),
-                                    ("after <time-of-day>after <time-of-day>", -3.963982744358857),
-                                    ("<day-of-month> (ordinal)morning", -3.963982744358857),
-                                    ("<day-of-month> (ordinal)after <time-of-day>",
-                                     -3.270835563798912),
-                                    ("until <time-of-day>morning", -3.4531571205928664),
-                                    ("until <time-of-day>after <time-of-day>", -4.3694478524670215),
-                                    ("about <time-of-day>after <time-of-day>", -4.3694478524670215),
-                                    ("by <time>morning", -4.3694478524670215),
-                                    ("<integer> (latent time-of-day)after <time-of-day>",
-                                     -3.963982744358857),
-                                    ("<integer> (latent time-of-day)morning", -3.676300671907076),
-                                    ("secondhour", -3.1166848839716534),
-                                    ("intersectmorning", -3.4531571205928664),
-                                    ("year (latent)morning", -2.6646997602285962),
-                                    ("year (latent)after <time-of-day>", -3.963982744358857),
-                                    ("at <time-of-day>after <time-of-day>", -4.3694478524670215)],
-                               n = 58}}),
-       ("today",
-        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}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.14571181118139365,
-                               unseen = -4.718498871295094,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -1.5740359853831845),
-                                    ("<integer> (latent time-of-day)", -2.3116349285139637),
-                                    ("about <time-of-day>", -4.0163830207523885),
-                                    ("hh:mm", -3.6109179126442243),
-                                    ("<time-of-day> rano", -2.917770732084279),
-                                    ("hour", -0.8383291904044432),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -2.2246235515243336),
-                                    ("minute", -3.100092288878234)],
-                               n = 51},
-                   koData =
-                     ClassData{prior = -1.9980959022258835, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -1.8325814637483102),
-                                    ("<integer> (latent time-of-day)", -1.8325814637483102),
-                                    ("relative minutes after|past <integer> (hour-of-day)",
-                                     -2.5257286443082556),
-                                    ("hour", -1.1394342831883648),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -2.5257286443082556),
-                                    ("minute", -2.5257286443082556)],
-                               n = 8}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("11th ordinal",
-        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}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -7.79615414697118e-2, unseen = -4.51085950651685,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.890371757896165),
-                                    ("<time> <part-of-day>", -3.8066624897703196),
-                                    ("intersect", -2.0149030205422647),
-                                    ("next <cycle>", -3.1135153092103742),
-                                    ("named-month", -2.1972245773362196),
-                                    ("half to|till|before <integer> (hour-of-day)",
-                                     -3.8066624897703196),
-                                    ("day", -2.70805020110221), ("afternoon", -3.1135153092103742),
-                                    ("this <cycle>", -2.890371757896165),
-                                    ("year", -3.1135153092103742),
-                                    ("named-day", -2.890371757896165),
-                                    ("hour", -2.3025850929940455), ("month", -1.666596326274049),
-                                    ("minute", -3.8066624897703196),
-                                    ("this <time>", -3.8066624897703196)],
-                               n = 37},
-                   koData =
-                     ClassData{prior = -2.5902671654458267,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon", -1.7047480922384253), ("hour", -1.7047480922384253)],
-                               n = 3}}),
-       ("8th ordinal",
-        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}}),
-       ("month (grain)",
-        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}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = -0.3184537311185346, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -0.8649974374866046),
-                                    ("<integer> (latent time-of-day)", -2.2512917986064953),
-                                    ("hour", -0.7472144018302211)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -1.5040773967762742),
-                                    ("<integer> (latent time-of-day)", -1.0986122886681098),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3}}),
-       ("on a named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4989911661189879, unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("second ordinalnamed-dayintersect", -2.833213344056216),
-                                    ("first ordinalnamed-dayon <date>", -2.833213344056216),
-                                    ("daymonth", -1.4469189829363254),
-                                    ("dayyear", -1.9859154836690123),
-                                    ("third ordinalnamed-dayintersect", -2.833213344056216),
-                                    ("third ordinalintersectyear", -2.833213344056216),
-                                    ("third ordinalnamed-dayon <date>", -3.2386784521643803),
-                                    ("first ordinalnamed-daynamed-month", -3.2386784521643803),
-                                    ("first ordinalintersectyear", -2.833213344056216),
-                                    ("first ordinalnamed-dayintersect", -2.833213344056216),
-                                    ("second ordinalnamed-dayon <date>", -3.2386784521643803),
-                                    ("second ordinalintersectyear", -2.833213344056216)],
-                               n = 17},
-                   koData =
-                     ClassData{prior = -0.9343092373768334,
-                               unseen = -3.6888794541139363,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("third ordinalnamed-daynamed-month", -2.9704144655697013),
-                                    ("first ordinalnamed-dayon <date>", -2.9704144655697013),
-                                    ("daymonth", -1.717651497074333),
-                                    ("14th ordinalnamed-month<integer> (latent time-of-day)",
-                                     -2.5649493574615367),
-                                    ("monthhour", -1.8718021769015913),
-                                    ("second ordinalnamed-daynamed-month", -2.9704144655697013),
-                                    ("third ordinalnamed-dayon <date>", -2.9704144655697013),
-                                    ("first ordinalnamed-daynamed-month", -2.9704144655697013),
-                                    ("ordinal (digits)named-month<integer> (latent time-of-day)",
-                                     -2.277267285009756),
-                                    ("second ordinalnamed-dayon <date>", -2.9704144655697013)],
-                               n = 11}}),
-       ("<ordinal> (as hour)",
-        Classifier{okData =
-                     ClassData{prior = -0.5773153650348236, unseen = -4.454347296253507,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("11th ordinal", -3.056356895370426),
-                                    ("8th ordinal", -3.3440389678222067),
-                                    ("21st ordinal no space", -3.7495040759303713),
-                                    ("20th ordinal", -3.7495040759303713),
-                                    ("third ordinal", -1.8035939268750578),
-                                    ("16th ordinal", -3.3440389678222067),
-                                    ("18th ordinal", -3.3440389678222067),
-                                    ("fifth ordinal", -3.7495040759303713),
-                                    ("seventh ordinal", -3.3440389678222067),
-                                    ("19th ordinal", -3.3440389678222067),
-                                    ("21-29th ordinal", -3.3440389678222067),
-                                    ("sixth ordinal", -3.3440389678222067),
-                                    ("15th ordinal", -3.3440389678222067),
-                                    ("second ordinal", -2.245426679154097),
-                                    ("ordinal (digits)", -2.3632097148104805),
-                                    ("10th ordinal", -2.496741107435003),
-                                    ("9th ordinal", -2.3632097148104805),
-                                    ("23rd ordinal no space", -3.7495040759303713)],
-                               n = 64},
-                   koData =
-                     ClassData{prior = -0.8241754429663495, unseen = -4.276666119016055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("8th ordinal", -3.164067588373206),
-                                    ("20th ordinal", -3.164067588373206),
-                                    ("third ordinal", -2.316769727986002),
-                                    ("14th ordinal", -3.164067588373206),
-                                    ("13th ordinal", -3.56953269648137),
-                                    ("15th ordinal", -2.8763855159214247),
-                                    ("second ordinal", -2.8763855159214247),
-                                    ("ordinal (digits)", -1.1716374236829996),
-                                    ("first ordinal", -1.864784604242945)],
-                               n = 50}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("21st ordinal no space",
-        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}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -0.916290731874155),
-                                    ("third ordinalquarter (grain)", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.916290731874155),
-                                    ("quarter", -0.916290731874155)],
-                               n = 1}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.7319205664859061,
-                               unseen = -6.3473892096560105,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -5.247024072160486),
-                                    ("mm/dd<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -5.652489180268651),
-                                    ("<hour-of-day> - <hour-of-day> (interval)on <date>",
-                                     -5.247024072160486),
-                                    ("named-daynamed-month", -4.736198448394496),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.247024072160486),
-                                    ("hourday", -3.8607297110405954),
-                                    ("dayhour", -2.790288299339182),
-                                    ("daymonth", -3.8607297110405954),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyabsorption of , after named day",
-                                     -4.736198448394496),
-                                    ("monthyear", -3.1675825304806504),
-                                    ("from <hour-of-day> - <hour-of-day> (interval)on a named-day",
-                                     -5.652489180268651),
-                                    ("from <time-of-day> - <time-of-day> (interval)on a named-day",
-                                     -5.652489180268651),
-                                    ("absorption of , after named dayintersect by \",\" 2",
-                                     -5.247024072160486),
-                                    ("intersecthh:mm", -5.247024072160486),
-                                    ("from <datetime> - <datetime> (interval)on a named-day",
-                                     -5.652489180268651),
-                                    ("at <time-of-day>intersect by \",\" 2", -5.247024072160486),
-                                    ("named-daylast <cycle>", -5.247024072160486),
-                                    ("named-day<time-of-day> rano", -5.652489180268651),
-                                    ("on a named-dayat <time-of-day>", -5.247024072160486),
-                                    ("at <time-of-day>named-day", -5.247024072160486),
-                                    ("at <time-of-day>on a named-day", -5.652489180268651),
-                                    ("<time> <part-of-day>on a named-day", -5.247024072160486),
-                                    ("on a named-day<time> <part-of-day>", -5.652489180268651),
-                                    ("last <day-of-week> of <time>year", -5.652489180268651),
-                                    ("today<time> <part-of-day>", -5.652489180268651),
-                                    ("todayat <time-of-day>", -5.652489180268651),
-                                    ("on <date>at <time-of-day>", -5.247024072160486),
-                                    ("dayday", -2.978340530842122),
-                                    ("on <date><time> <part-of-day>", -5.652489180268651),
-                                    ("intersect by \",\"hh:mm", -4.399726211773283),
-                                    ("mm/ddat <time-of-day>", -4.959341999708705),
-                                    ("last <cycle> <time>year", -4.736198448394496),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.959341999708705),
-                                    ("intersect<day-of-month> (non ordinal) <named-month>",
-                                     -4.959341999708705),
-                                    ("dayyear", -3.6375861597263857),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.247024072160486),
-                                    ("day-after-tomorrow (single-word)at <time-of-day>",
-                                     -5.652489180268651),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -4.148411783492376),
-                                    ("tomorrow<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -5.652489180268651),
-                                    ("named-monthyear", -3.51242301677238),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.26619481914876),
-                                    ("tomorrowuntil <time-of-day>", -5.247024072160486),
-                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.148411783492376),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect by \",\"",
-                                     -4.736198448394496),
-                                    ("named-dayin <duration>", -5.652489180268651),
-                                    ("last <day-of-week> <time>year", -5.247024072160486),
-                                    ("<time-of-day> ranoon <date>", -5.247024072160486),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -4.959341999708705),
-                                    ("named-daynext <cycle>", -4.736198448394496),
-                                    ("named-dayintersect", -5.247024072160486),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.959341999708705),
-                                    ("on <date><time-of-day> rano", -5.652489180268651),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocytomorrow",
-                                     -5.652489180268651),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.652489180268651),
-                                    ("at <time-of-day>intersect", -5.247024072160486),
-                                    ("dayminute", -3.301113923105173),
-                                    ("intersect by \",\" 2hh:mm", -4.399726211773283),
-                                    ("<time-of-day> ranoon a named-day", -5.247024072160486),
-                                    ("from <hour-of-day> - <hour-of-day> (interval)on <date>",
-                                     -5.652489180268651),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.652489180268651),
-                                    ("intersectyear", -5.247024072160486),
-                                    ("on a named-day<time-of-day> rano", -5.652489180268651),
-                                    ("<ordinal> <cycle> of <time>year", -5.652489180268651),
-                                    ("minuteday", -2.338303175596125),
-                                    ("absorption of , after named dayintersect",
-                                     -5.247024072160486),
-                                    ("named-dayon <date>", -4.04305126783455),
-                                    ("named-day<time> <part-of-day>", -4.959341999708705),
-                                    ("named-dayat <time-of-day>", -5.247024072160486),
-                                    ("yearhh:mm", -5.652489180268651),
-                                    ("at <time-of-day>intersect by \",\"", -5.247024072160486),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -5.247024072160486),
-                                    ("tomorrowexactly <time-of-day>", -4.959341999708705),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -5.247024072160486),
-                                    ("at <time-of-day>on <date>", -5.652489180268651),
-                                    ("on <date>year", -4.26619481914876),
-                                    ("dayweek", -3.7065790312133373),
-                                    ("<time> <part-of-day>on <date>", -5.247024072160486),
-                                    ("weekyear", -4.399726211773283),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -4.959341999708705),
-                                    ("<ordinal> <cycle> <time>year", -5.247024072160486),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect by \",\" 2",
-                                     -4.736198448394496),
-                                    ("tomorrowat <time-of-day>", -5.652489180268651),
-                                    ("named-daythis <cycle>", -5.247024072160486),
-                                    ("tomorrow<time> <part-of-day>", -5.652489180268651),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect",
-                                     -4.736198448394496),
-                                    ("<named-month> <day-of-month> (ordinal)year",
-                                     -5.652489180268651),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocynamed-day",
-                                     -4.736198448394496),
-                                    ("tomorrow<time-of-day> rano", -5.652489180268651),
-                                    ("<datetime> - <datetime> (interval)on a named-day",
-                                     -5.247024072160486),
-                                    ("last <cycle> of <time>year", -5.247024072160486),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -5.652489180268651),
-                                    ("<time-of-day> - <time-of-day> (interval)on a named-day",
-                                     -5.247024072160486),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -5.247024072160486),
-                                    ("<hour-of-day> - <hour-of-day> (interval)on a named-day",
-                                     -5.247024072160486),
-                                    ("yearminute", -5.652489180268651)],
-                               n = 215},
-                   koData =
-                     ClassData{prior = -0.655821222947259, unseen = -6.405228458030842,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)<named-month> <day-of-month> (non ordinal)",
-                                     -4.61181472870676),
-                                    ("<time-of-day> ranoby <time>", -5.304961909266705),
-                                    ("intersect by \",\"named-month", -4.206349620598596),
-                                    ("named-daynamed-month", -5.304961909266705),
-                                    ("hourday", -2.7926562852905903),
-                                    ("dayhour", -3.107737331930486),
-                                    ("daymonth", -3.312531744576499),
-                                    ("monthday", -5.304961909266705),
-                                    ("monthyear", -4.794136285500715),
-                                    ("named-month<hour-of-day> <integer> (as relative minutes)",
-                                     -5.71042701737487),
-                                    ("at <time-of-day>intersect by \",\" 2", -5.71042701737487),
-                                    ("houryear", -3.570360853878599),
-                                    ("<time> <part-of-day>until <time-of-day>", -5.304961909266705),
-                                    ("<ordinal> (as hour)intersect", -3.145477659913333),
-                                    ("monthhour", -4.61181472870676),
-                                    ("<time> <part-of-day><time> <part-of-day>",
-                                     -5.017279836814924),
-                                    ("hourmonth", -2.0860860843985045),
-                                    ("mm/ddat <time-of-day>", -5.71042701737487),
-                                    ("hourhour", -4.794136285500715),
-                                    ("<time> <part-of-day>by <time>", -5.304961909266705),
-                                    ("intersectnamed-month", -3.4591352187683744),
-                                    ("dayyear", -4.457664048879502),
-                                    ("<time-of-day> ranoby the end of <time>", -5.304961909266705),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -5.304961909266705),
-                                    ("intersect by \",\" 2named-month", -4.206349620598596),
-                                    ("monthminute", -5.304961909266705),
-                                    ("minutemonth", -5.017279836814924),
-                                    ("named-monthyear", -4.794136285500715),
-                                    ("absorption of , after named daynamed-month",
-                                     -4.324132656254979),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect by \",\"",
-                                     -5.304961909266705),
-                                    ("after <time-of-day>at <time-of-day>", -5.71042701737487),
-                                    ("hh:mmby the end of <time>", -5.71042701737487),
-                                    ("<ordinal> (as hour)named-month", -3.036278367948341),
-                                    ("daysecond", -5.304961909266705),
-                                    ("<time> <part-of-day>by the end of <time>",
-                                     -5.304961909266705),
-                                    ("named-month<ordinal> (as hour)", -4.794136285500715),
-                                    ("<time> <part-of-day><time-of-day> rano", -5.71042701737487),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -5.71042701737487),
-                                    ("named-dayintersect", -4.100989104940769),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.71042701737487),
-                                    ("<time-of-day> rano<time> <part-of-day>", -5.304961909266705),
-                                    ("at <time-of-day>intersect", -5.71042701737487),
-                                    ("dayminute", -5.304961909266705),
-                                    ("<named-month> <day-of-month> (non ordinal)by <time>",
-                                     -5.71042701737487),
-                                    ("intersecton <date>", -4.324132656254979),
-                                    ("intersectyear", -3.312531744576499),
-                                    ("minuteday", -3.7645168683195562),
-                                    ("absorption of , after named dayintersect",
-                                     -4.206349620598596),
-                                    ("<ordinal> (as hour)year", -5.71042701737487),
-                                    ("named-dayon <date>", -4.794136285500715),
-                                    ("hh:mmon <date>", -5.304961909266705),
-                                    ("absorption of , after named day<ordinal> (as hour)",
-                                     -4.206349620598596),
-                                    ("at <time-of-day>intersect by \",\"", -5.71042701737487),
-                                    ("<named-month> <day-of-month> (non ordinal)by the end of <time>",
-                                     -5.71042701737487),
-                                    ("tomorrowexactly <time-of-day>", -5.71042701737487),
-                                    ("hoursecond", -3.8386248404732783),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -5.304961909266705),
-                                    ("named-day<ordinal> (as hour)", -5.017279836814924),
-                                    ("<ordinal> (as hour)named-day", -4.206349620598596),
-                                    ("named-monthrelative minutes to|till|before <integer> (hour-of-day)",
-                                     -5.71042701737487),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -5.304961909266705),
-                                    ("intersectintersect", -4.457664048879502),
-                                    ("hh:mmon a named-day", -5.304961909266705),
-                                    ("named-monthintersect", -5.71042701737487),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect by \",\" 2",
-                                     -5.304961909266705),
-                                    ("hh:mmby <time>", -5.71042701737487),
-                                    ("tomorrowat <time-of-day>", -5.71042701737487),
-                                    ("minutesecond", -5.304961909266705),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect",
-                                     -5.304961909266705),
-                                    ("yearminute", -5.304961909266705)],
-                               n = 232}}),
-       ("half after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("twenty",
-        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}}),
-       ("20th ordinal",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("a few",
-        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}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7047480922384253),
-                                    ("first ordinalweek (grain)named-month", -1.7047480922384253),
-                                    ("weekmonth", -1.2992829841302609),
-                                    ("first ordinalweek (grain)intersect", -1.7047480922384253),
-                                    ("third ordinalday (grain)named-month", -1.7047480922384253)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("season",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("year (grain)",
-        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 <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6739764335716716),
-                                    ("<time-of-day> rano<time-of-day> rano", -2.0794415416798357),
-                                    ("hh:mmhh:mm", -1.6739764335716716),
-                                    ("hourhour", -1.6739764335716716),
-                                    ("<time-of-day> rano<integer> (latent time-of-day)",
-                                     -2.0794415416798357)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6739764335716716),
-                                    ("minutehour", -1.6739764335716716),
-                                    ("hh:mmintersect", -1.6739764335716716),
-                                    ("hh:mm<integer> (latent time-of-day)", -1.6739764335716716)],
-                               n = 4}}),
-       ("from <hour-of-day> - <hour-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.6931471805599453),
-                                    ("hh:mmhh:mm", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("month (grain)", -3.044522437723423),
-                                    ("year (grain)", -2.639057329615259),
-                                    ("second", -3.044522437723423),
-                                    ("week (grain)", -1.540445040947149),
-                                    ("quarter", -2.3513752571634776), ("year", -2.639057329615259),
-                                    ("second (grain)", -3.044522437723423),
-                                    ("month", -3.044522437723423),
-                                    ("quarter (grain)", -2.3513752571634776)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -2.772588722239781, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minute (grain)", -1.9459101490553135),
-                                    ("minute", -1.9459101490553135)],
-                               n = 1}}),
-       ("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.40546510810816444,
-                               unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("<time-of-day> rano<time-of-day> rano", -2.0149030205422647),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("hourhour", -1.6094379124341003),
-                                    ("<time-of-day> rano<integer> (latent time-of-day)",
-                                     -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minutehour", -1.2992829841302609),
-                                    ("hh:mm<integer> (latent time-of-day)", -1.2992829841302609)],
-                               n = 2}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("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 = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -8.004270767353637e-2),
-                                    ("one", -2.5649493574615367)],
-                               n = 24}}),
-       ("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}}),
-       ("evening|night",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("third ordinal",
-        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}}),
-       ("yesterday",
-        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}}),
-       ("<ordinal> quarter <year>",
-        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}}),
-       ("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}}),
-       ("intersect by \",\" 2",
-        Classifier{okData =
-                     ClassData{prior = -0.46430560813109784, unseen = -4.74493212836325,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect by \",\"year", -4.04305126783455),
-                                    ("intersect by \",\" 2intersect", -4.04305126783455),
-                                    ("dayday", -1.4781019103730135),
-                                    ("named-dayintersect by \",\"", -3.6375861597263857),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.349904087274605),
-                                    ("intersect<day-of-month> (non ordinal) <named-month>",
-                                     -3.349904087274605),
-                                    ("dayyear", -2.9444389791664407),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.04305126783455),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -2.538973871058276),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -2.6567569067146595),
-                                    ("intersect by \",\"intersect", -4.04305126783455),
-                                    ("named-dayintersect", -3.6375861597263857),
-                                    ("intersect by \",\" 2year", -4.04305126783455),
-                                    ("named-dayintersect by \",\" 2", -3.6375861597263857),
-                                    ("dayminute", -2.538973871058276),
-                                    ("intersectyear", -4.04305126783455),
-                                    ("minuteday", -2.790288299339182),
-                                    ("intersectintersect", -4.04305126783455),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -2.538973871058276),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -3.6375861597263857)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -0.9903987040278769,
-                               unseen = -4.3694478524670215,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -2.277267285009756),
-                                    ("dayhour", -1.5234954826333758),
-                                    ("daymonth", -2.277267285009756),
-                                    ("intersectnamed-month", -2.9704144655697013),
-                                    ("minutemonth", -2.9704144655697013),
-                                    ("named-dayintersect", -2.159484249353372),
-                                    ("named-day<ordinal> (as hour)", -2.159484249353372)],
-                               n = 26}}),
-       ("16th ordinal",
-        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}}),
-       ("quarter to|till|before <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -1.791759469228055),
-                                    ("<integer> (latent time-of-day)", -1.791759469228055),
-                                    ("noon", -1.3862943611198906), ("hour", -0.8754687373538999)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> (latent time-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.505548566665147, unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.598590697792199e-2),
-                                    ("fifteen", -3.0204248861443626)],
-                               n = 38},
-                   koData =
-                     ClassData{prior = -0.924258901523332, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.15415067982725836),
-                                    ("one", -2.639057329615259), ("fifteen", -2.639057329615259)],
-                               n = 25}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("second ordinalnamed-dayintersect", -2.0149030205422647),
-                                    ("daymonth", -1.0986122886681098),
-                                    ("third ordinalnamed-dayintersect", -2.0149030205422647),
-                                    ("first ordinalnamed-daynamed-month", -2.0149030205422647),
-                                    ("first ordinalnamed-dayintersect", -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("third ordinalnamed-daynamed-month", -1.8718021769015913),
-                                    ("daymonth", -1.1786549963416462),
-                                    ("second ordinalnamed-daynamed-month", -1.8718021769015913),
-                                    ("first ordinalnamed-daynamed-month", -1.8718021769015913)],
-                               n = 3}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.51085950651685,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 89},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("18th ordinal",
-        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}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fifth ordinal",
-        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.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <day-of-week> <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.791759469228055),
-                                    ("daymonth", -0.9444616088408514),
-                                    ("named-dayintersect", -1.791759469228055),
-                                    ("named-dayon <date>", -1.791759469228055)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayin <duration>", -1.3862943611198906),
-                                    ("dayminute", -1.3862943611198906)],
-                               n = 1}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("<unit-of-duration> as a duration",
-        Classifier{okData =
-                     ClassData{prior = -2.3608540011180215,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6314168191528755),
-                                    ("hour (grain)", -2.7300291078209855),
-                                    ("second", -2.4423470353692043),
-                                    ("week (grain)", -1.6314168191528755),
-                                    ("day", -3.1354942159291497),
-                                    ("minute (grain)", -3.1354942159291497),
-                                    ("second (grain)", -2.4423470353692043),
-                                    ("hour", -2.7300291078209855), ("minute", -3.1354942159291497),
-                                    ("day (grain)", -3.1354942159291497)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -9.909090264423089e-2,
-                               unseen = -5.720311776607412,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.161679639916808),
-                                    ("month (grain)", -3.2321210516182215),
-                                    ("hour (grain)", -2.7212954278522306),
-                                    ("year (grain)", -2.8838143573500057),
-                                    ("second", -2.8838143573500057),
-                                    ("week (grain)", -2.161679639916808),
-                                    ("day", -2.498151876538021), ("quarter", -3.5198031240700023),
-                                    ("minute (grain)", -2.8838143573500057),
-                                    ("year", -2.8838143573500057),
-                                    ("second (grain)", -2.8838143573500057),
-                                    ("hour", -2.7212954278522306), ("month", -3.2321210516182215),
-                                    ("quarter (grain)", -3.5198031240700023),
-                                    ("minute", -2.8838143573500057),
-                                    ("day (grain)", -2.498151876538021)],
-                               n = 144}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -1.5040773967762742),
-                                    ("evening|night", -1.0986122886681098),
-                                    ("hour", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("christmas 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}}),
-       ("<day-of-month>(ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.19671029424605427,
-                               unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("third ordinalnamed-month", -3.295836866004329),
-                                    ("8th ordinalnamed-month", -2.890371757896165),
-                                    ("first ordinalnamed-month", -2.890371757896165),
-                                    ("15th ordinalnamed-month", -2.890371757896165),
-                                    ("ordinal (digits)named-month", -1.2163953243244932),
-                                    ("month", -0.8109302162163288),
-                                    ("13th ordinalnamed-month", -3.295836866004329)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -1.7227665977411035,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("14th ordinalnamed-month", -1.791759469228055),
-                                    ("ordinal (digits)named-month", -1.5040773967762742),
-                                    ("month", -1.0986122886681098)],
-                               n = 5}}),
-       ("<duration> hence",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3121863889661687),
-                                    ("<unit-of-duration> as a duration", -1.8718021769015913),
-                                    ("day", -2.159484249353372), ("year", -2.5649493574615367),
-                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
-                                    ("month", -2.5649493574615367)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("<unit-of-duration> as a duration", -0.9808292530117262),
-                                    ("day", -1.6739764335716716), ("year", -2.0794415416798357),
-                                    ("month", -2.0794415416798357)],
-                               n = 5}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 11}}),
-       ("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.2876820724517809,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<cycle> after <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -0.6931471805599453),
-                                    ("dayday", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("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}}),
-       ("half to|till|before <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.3862943611198906),
-                                    ("day", -1.3862943611198906),
-                                    ("named-day", -1.3862943611198906),
-                                    ("month", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("two",
-        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}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -2.456735772821304),
-                                    ("year (latent)", -2.8622008809294686),
-                                    ("<integer> (latent time-of-day)", -1.9459101490553135),
-                                    ("day", -2.456735772821304), ("year", -2.8622008809294686),
-                                    ("hh:mm", -2.8622008809294686),
-                                    ("<day-of-month> (ordinal)", -2.456735772821304),
-                                    ("noon", -2.8622008809294686),
-                                    ("<time-of-day> rano", -2.8622008809294686),
-                                    ("hour", -1.3581234841531944), ("minute", -2.8622008809294686)],
-                               n = 12}}),
-       ("seventh ordinal",
-        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}}),
-       ("half an hour",
-        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}}),
-       ("one",
-        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}}),
-       ("afternoon",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("<duration> from now",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("second", -1.9459101490553135),
-                                    ("<unit-of-duration> as a duration", -1.540445040947149),
-                                    ("day", -1.9459101490553135), ("year", -1.9459101490553135),
-                                    ("<integer> <unit-of-duration>", -1.540445040947149),
-                                    ("minute", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<unit-of-duration> as a duration", -1.2039728043259361),
-                                    ("year", -1.6094379124341003), ("minute", -1.6094379124341003)],
-                               n = 2}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5869650565820417),
-                                    ("year (grain)", -1.9924301646902063),
-                                    ("week (grain)", -1.5869650565820417),
-                                    ("day", -2.6855773452501515), ("quarter", -2.3978952727983707),
-                                    ("year", -1.9924301646902063),
-                                    ("quarter (grain)", -2.3978952727983707),
-                                    ("day (grain)", -2.6855773452501515)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        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}}),
-       ("last <cycle> <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.540445040947149),
-                                    ("week (grain)named-month", -2.639057329615259),
-                                    ("day (grain)intersect", -2.2335922215070942),
-                                    ("day (grain)on <date>", -2.2335922215070942),
-                                    ("weekmonth", -1.540445040947149),
-                                    ("day (grain)named-month", -2.639057329615259),
-                                    ("week (grain)intersect", -2.2335922215070942),
-                                    ("week (grain)on <date>", -2.2335922215070942)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.4423470353692043),
-                                    ("<ordinal> (as hour)", -1.5260563034950494),
-                                    ("<integer> (latent time-of-day)", -2.03688192726104),
-                                    ("hour", -0.9382696385929302),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -2.4423470353692043)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -2.1972245773362196,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("relative minutes after|past <integer> (hour-of-day)",
-                                     -1.5040773967762742),
-                                    ("minute", -1.5040773967762742)],
-                               n = 1}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.14842000511827333,
-                               unseen = -3.295836866004329,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -1.9810014688665833, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.252762968495368),
-                                    ("daymonth", -0.8472978603872037),
-                                    ("named-dayintersect", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.7404000654104909, unseen = -4.59511985013459,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.2823823856765264),
-                                    ("threemonth (grain)", -3.4863551900024623),
-                                    ("fifteenminute (grain)", -3.891820298110627),
-                                    ("a fewhour (grain)", -3.891820298110627),
-                                    ("integer (numeric)day (grain)", -2.793208009442517),
-                                    ("twoweek (grain)", -3.891820298110627),
-                                    ("fiveday (grain)", -3.891820298110627),
-                                    ("oneweek (grain)", -3.1986731175506815),
-                                    ("oneminute (grain)", -3.891820298110627),
-                                    ("integer (numeric)year (grain)", -3.891820298110627),
-                                    ("day", -2.505525936990736), ("year", -3.1986731175506815),
-                                    ("integer (numeric)week (grain)", -3.1986731175506815),
-                                    ("oneday (grain)", -3.891820298110627),
-                                    ("hour", -3.1986731175506815), ("month", -3.4863551900024623),
-                                    ("threeweek (grain)", -3.4863551900024623),
-                                    ("integer (numeric)minute (grain)", -2.793208009442517),
-                                    ("minute", -2.505525936990736),
-                                    ("integer (numeric)hour (grain)", -3.4863551900024623),
-                                    ("twoyear (grain)", -3.4863551900024623)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -0.6480267452794757, unseen = -4.653960350157523,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.8526314299133175),
-                                    ("threemonth (grain)", -3.951243718581427),
-                                    ("threehour (grain)", -3.951243718581427),
-                                    ("integer (numeric)day (grain)", -3.258096538021482),
-                                    ("twoweek (grain)", -3.951243718581427),
-                                    ("twominute (grain)", -3.951243718581427),
-                                    ("second", -2.6984807500860595),
-                                    ("threeday (grain)", -3.951243718581427),
-                                    ("threeyear (grain)", -3.951243718581427),
-                                    ("integer (numeric)second (grain)", -3.0349529867072724),
-                                    ("twomonth (grain)", -3.951243718581427),
-                                    ("onehour (grain)", -3.951243718581427),
-                                    ("integer (numeric)year (grain)", -3.545778610473263),
-                                    ("threesecond (grain)", -3.951243718581427),
-                                    ("day", -2.6984807500860595), ("year", -3.0349529867072724),
-                                    ("threeminute (grain)", -3.951243718581427),
-                                    ("integer (numeric)week (grain)", -3.258096538021482),
-                                    ("twoday (grain)", -3.951243718581427),
-                                    ("hour", -2.6984807500860595), ("month", -3.258096538021482),
-                                    ("threeweek (grain)", -3.951243718581427),
-                                    ("integer (numeric)minute (grain)", -3.545778610473263),
-                                    ("a fewday (grain)", -3.951243718581427),
-                                    ("integer (numeric)month (grain)", -3.951243718581427),
-                                    ("minute", -3.0349529867072724),
-                                    ("twosecond (grain)", -3.951243718581427),
-                                    ("integer (numeric)hour (grain)", -3.258096538021482),
-                                    ("fifteenhour (grain)", -3.951243718581427),
-                                    ("twoyear (grain)", -3.951243718581427)],
-                               n = 34}}),
-       ("19th ordinal",
-        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 = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("<unit-of-duration> as a durationtomorrow",
-                                     -0.6931471805599453)],
-                               n = 1}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)<integer> (latent time-of-day)",
-                                     -1.7047480922384253),
-                                    ("fifteen<ordinal> (as hour)", -1.7047480922384253),
-                                    ("hour", -1.0116009116784799),
-                                    ("integer (numeric)<ordinal> (as hour)", -1.7047480922384253)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon", -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 2}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.46430560813109784, unseen = -4.74493212836325,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect by \",\"year", -4.04305126783455),
-                                    ("intersect by \",\" 2intersect", -4.04305126783455),
-                                    ("dayday", -1.4781019103730135),
-                                    ("named-dayintersect by \",\"", -3.6375861597263857),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.349904087274605),
-                                    ("intersect<day-of-month> (non ordinal) <named-month>",
-                                     -3.349904087274605),
-                                    ("dayyear", -2.9444389791664407),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.04305126783455),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -2.538973871058276),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -2.6567569067146595),
-                                    ("intersect by \",\"intersect", -4.04305126783455),
-                                    ("named-dayintersect", -3.6375861597263857),
-                                    ("intersect by \",\" 2year", -4.04305126783455),
-                                    ("named-dayintersect by \",\" 2", -3.6375861597263857),
-                                    ("dayminute", -2.538973871058276),
-                                    ("intersectyear", -4.04305126783455),
-                                    ("minuteday", -2.790288299339182),
-                                    ("intersectintersect", -4.04305126783455),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -2.538973871058276),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -3.6375861597263857)],
-                               n = 44},
-                   koData =
-                     ClassData{prior = -0.9903987040278769,
-                               unseen = -4.3694478524670215,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -2.277267285009756),
-                                    ("dayhour", -1.5234954826333758),
-                                    ("daymonth", -2.277267285009756),
-                                    ("intersectnamed-month", -2.9704144655697013),
-                                    ("minutemonth", -2.9704144655697013),
-                                    ("named-dayintersect", -2.159484249353372),
-                                    ("named-day<ordinal> (as hour)", -2.159484249353372)],
-                               n = 26}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -4.652001563489282e-2,
-                               unseen = -3.1354942159291497,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
-                   koData =
-                     ClassData{prior = -3.0910424533583156,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("14th ordinal",
-        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}}),
-       ("21-29th ordinal",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("second ordinal", -0.6931471805599453),
-                                    ("first ordinal", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.584967478670572,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 96},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> before <time>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.6931471805599453),
-                                    ("<unit-of-duration> as a durationyesterday",
-                                     -0.6931471805599453)],
-                               n = 1}}),
-       ("second (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.9985288301111273,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -0.4595323293784402, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
-       ("13th ordinal",
-        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.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daylast <cycle>", -0.6931471805599453),
-                                    ("dayweek", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3121863889661687),
-                                    ("<unit-of-duration> as a duration", -1.8718021769015913),
-                                    ("day", -2.159484249353372), ("year", -2.5649493574615367),
-                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
-                                    ("month", -2.5649493574615367)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("<unit-of-duration> as a duration", -0.9808292530117262),
-                                    ("day", -1.6739764335716716), ("year", -2.0794415416798357),
-                                    ("month", -2.0794415416798357)],
-                               n = 5}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.1631508098056809),
-                                    ("named-day", -1.1631508098056809)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> o'clock", -2.5902671654458267),
-                                    ("intersect", -2.3025850929940455),
-                                    ("year (latent)", -2.0794415416798357),
-                                    ("<integer> (latent time-of-day)", -2.0794415416798357),
-                                    ("day", -1.742969305058623), ("year", -2.0794415416798357),
-                                    ("named-day", -2.3025850929940455),
-                                    ("hour", -1.742969305058623)],
-                               n = 16}}),
-       ("sixth ordinal",
-        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 = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("11th ordinal", -2.2335922215070942),
-                                    ("8th ordinal", -2.639057329615259),
-                                    ("third ordinal", -2.2335922215070942),
-                                    ("16th ordinal", -2.639057329615259),
-                                    ("second ordinal", -1.7227665977411035),
-                                    ("ordinal (digits)", -2.2335922215070942),
-                                    ("10th ordinal", -1.7227665977411035),
-                                    ("9th ordinal", -1.7227665977411035)],
-                               n = 20}}),
-       ("noon",
-        Classifier{okData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.1823215567939546,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -2.2246235515243336),
-                                    ("<ordinal> (as hour)", -2.512305623976115),
-                                    ("<integer> (latent time-of-day)", -2.512305623976115),
-                                    ("<time-of-day> rano", -2.512305623976115),
-                                    ("hour", -1.213022639845854),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -2.917770732084279)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -4.060443010546419,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -2.2512917986064953),
-                                    ("<ordinal> (as hour)", -2.9444389791664407),
-                                    ("year (latent)", -2.6567569067146595),
-                                    ("yesterday", -3.349904087274605),
-                                    ("<integer> (latent time-of-day)", -3.349904087274605),
-                                    ("day", -2.9444389791664407), ("year", -2.6567569067146595),
-                                    ("hh:mm", -3.349904087274605),
-                                    ("<day-of-month> (ordinal)", -3.349904087274605),
-                                    ("noon", -2.9444389791664407),
-                                    ("<time-of-day> rano", -3.349904087274605),
-                                    ("hour", -1.3350010667323402),
-                                    ("<datetime> - <datetime> (interval)", -3.349904087274605),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -3.349904087274605),
-                                    ("<hour-of-day> - <hour-of-day> (interval)",
-                                     -3.349904087274605),
-                                    ("minute", -3.349904087274605)],
-                               n = 20}}),
-       ("<integer> and an half hours",
-        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}}),
-       ("<time-of-day> rano",
-        Classifier{okData =
-                     ClassData{prior = -0.10008345855698253,
-                               unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.0149030205422647),
-                                    ("<ordinal> (as hour)", -2.70805020110221),
-                                    ("<integer> (latent time-of-day)", -1.5040773967762742),
-                                    ("hh:mm", -3.1135153092103742),
-                                    ("until <time-of-day>", -2.70805020110221),
-                                    ("hour", -0.8622235106038793), ("minute", -3.1135153092103742)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -2.3513752571634776,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.7047480922384253),
-                                    ("until <time-of-day>", -1.7047480922384253),
-                                    ("hour", -1.2992829841302609)],
-                               n = 2}}),
-       ("after <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               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.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -2.4849066497880004),
-                                    ("day", -0.8754687373538999),
-                                    ("named-day", -0.8754687373538999),
-                                    ("month", -2.4849066497880004)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716),
-                                    ("month (grain)", -1.6739764335716716),
-                                    ("year (grain)", -2.367123614131617),
-                                    ("week (grain)", -1.6739764335716716),
-                                    ("year", -2.367123614131617), ("month", -1.6739764335716716)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716),
-                                    ("week (grain)", -1.6739764335716716),
-                                    ("day", -1.6739764335716716),
-                                    ("day (grain)", -1.6739764335716716)],
-                               n = 4}}),
-       ("christmas",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.793208009442517),
-                                    ("threemonth (grain)", -3.1986731175506815),
-                                    ("threehour (grain)", -3.1986731175506815),
-                                    ("integer (numeric)day (grain)", -3.1986731175506815),
-                                    ("second", -2.793208009442517),
-                                    ("threeday (grain)", -3.1986731175506815),
-                                    ("threeyear (grain)", -3.1986731175506815),
-                                    ("integer (numeric)second (grain)", -3.1986731175506815),
-                                    ("integer (numeric)year (grain)", -3.1986731175506815),
-                                    ("threesecond (grain)", -3.1986731175506815),
-                                    ("day", -2.505525936990736), ("year", -2.793208009442517),
-                                    ("threeminute (grain)", -3.1986731175506815),
-                                    ("integer (numeric)week (grain)", -3.1986731175506815),
-                                    ("hour", -2.793208009442517), ("month", -3.1986731175506815),
-                                    ("threeweek (grain)", -3.1986731175506815),
-                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
-                                    ("a fewday (grain)", -3.1986731175506815),
-                                    ("minute", -2.793208009442517),
-                                    ("integer (numeric)hour (grain)", -3.1986731175506815)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("15th ordinal",
-        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}}),
-       ("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 = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)", -2.456735772821304),
-                                    ("year (latent)", -2.8622008809294686),
-                                    ("<integer> (latent time-of-day)", -1.9459101490553135),
-                                    ("day", -2.456735772821304), ("year", -2.8622008809294686),
-                                    ("hh:mm", -2.8622008809294686),
-                                    ("<day-of-month> (ordinal)", -2.456735772821304),
-                                    ("noon", -2.8622008809294686),
-                                    ("<time-of-day> rano", -2.8622008809294686),
-                                    ("hour", -1.3581234841531944), ("minute", -2.8622008809294686)],
-                               n = 12}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -4.0943445622221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.691243082785829),
-                                    ("number.number hours", -3.3843902633457743),
-                                    ("second", -2.9789251552376097),
-                                    ("<unit-of-duration> as a duration", -1.9980959022258835),
-                                    ("day", -2.9789251552376097),
-                                    ("half an hour", -3.3843902633457743),
-                                    ("<integer> <unit-of-duration>", -1.5125880864441827),
-                                    ("<integer> and an half hours", -3.3843902633457743),
-                                    ("hour", -2.2857779746776643), ("minute", -1.5125880864441827),
-                                    ("about <duration>", -2.9789251552376097)],
-                               n = 24},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.749199854809259), ("second", -2.03688192726104),
-                                    ("<unit-of-duration> as a duration", -1.5260563034950494),
-                                    ("<integer> <unit-of-duration>", -2.03688192726104),
-                                    ("minute", -2.4423470353692043)],
-                               n = 6}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.466337068793427, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.7227665977411035),
-                                    ("hh:mmhh:mm", -1.7227665977411035),
-                                    ("dayday", -2.2335922215070942),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -2.2335922215070942)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.262364264467491, unseen = -4.04305126783455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.9267394020670396),
-                                    ("about <time-of-day>noon", -3.332204510175204),
-                                    ("minuteminute", -2.2335922215070942),
-                                    ("<time-of-day> rano<time-of-day> rano", -3.332204510175204),
-                                    ("until <time-of-day>noon", -3.332204510175204),
-                                    ("hh:mmhh:mm", -3.332204510175204),
-                                    ("hourhour", -1.540445040947149),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -2.9267394020670396),
-                                    ("after <time-of-day>noon", -2.9267394020670396),
-                                    ("hh:mmintersect", -2.4159137783010487),
-                                    ("at <time-of-day>noon", -3.332204510175204),
-                                    ("<ordinal> (as hour)noon", -2.2335922215070942),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -2.9267394020670396),
-                                    ("yearminute", -2.9267394020670396)],
-                               n = 20}}),
-       ("second ordinal",
-        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}}),
-       ("<time-of-day> popo\322udniu/wieczorem/w nocy",
-        Classifier{okData =
-                     ClassData{prior = -1.5037877364540559e-2,
-                               unseen = -4.962844630259907,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("exactly <time-of-day>", -4.2626798770413155),
-                                    ("at <time-of-day>", -2.4709204078132605),
-                                    ("<ordinal> (as hour)", -1.5218398531161146),
-                                    ("<integer> (latent time-of-day)", -2.01138807843482),
-                                    ("about <time-of-day>", -4.2626798770413155),
-                                    ("hh:mm", -3.857214768933151),
-                                    ("until <time-of-day>", -4.2626798770413155),
-                                    ("hour", -0.812692331209728), ("minute", -3.3463891451671604),
-                                    ("after <time-of-day>", -3.857214768933151)],
-                               n = 66},
-                   koData =
-                     ClassData{prior = -4.204692619390966, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.791759469228055),
-                                    ("hour", -1.791759469228055)],
-                               n = 1}}),
-       ("fifteen",
-        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-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.749199854809259, unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.4350845252893227),
-                                    ("hh:mmhh:mm", -1.4350845252893227)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.19105523676270922,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about <time-of-day>noon", -3.2386784521643803),
-                                    ("relative minutes to|till|before <integer> (hour-of-day)<integer> (latent time-of-day)",
-                                     -3.2386784521643803),
-                                    ("minuteminute", -3.2386784521643803),
-                                    ("<time-of-day> rano<time-of-day> rano", -3.2386784521643803),
-                                    ("until <time-of-day>noon", -3.2386784521643803),
-                                    ("hh:mmhh:mm", -3.2386784521643803),
-                                    ("hourhour", -1.3668762752627892),
-                                    ("minutehour", -1.9859154836690123),
-                                    ("after <time-of-day>noon", -2.833213344056216),
-                                    ("at <time-of-day>noon", -3.2386784521643803),
-                                    ("<ordinal> (as hour)noon", -2.1400661634962708),
-                                    ("<time-of-day> rano<integer> (latent time-of-day)",
-                                     -3.2386784521643803),
-                                    ("hh:mm<integer> (latent time-of-day)", -2.1400661634962708)],
-                               n = 19}}),
-       ("<hour-of-day> - <hour-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.3350010667323402),
-                                    ("hh:mmhh:mm", -1.3350010667323402)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about <time-of-day>noon", -3.068052935133617),
-                                    ("minuteminute", -3.068052935133617),
-                                    ("<time-of-day> rano<time-of-day> rano", -3.068052935133617),
-                                    ("until <time-of-day>noon", -3.068052935133617),
-                                    ("hh:mmhh:mm", -3.068052935133617),
-                                    ("hourhour", -0.9886113934537812),
-                                    ("after <time-of-day>noon", -2.662587827025453),
-                                    ("at <time-of-day>noon", -3.068052935133617),
-                                    ("<ordinal> (as hour)noon", -1.9694406464655074),
-                                    ("<integer> (latent time-of-day)noon", -2.662587827025453),
-                                    ("<integer> (latent time-of-day)<ordinal> (as hour)",
-                                     -2.662587827025453)],
-                               n = 16}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.583997552432231),
-                                    ("integer (numeric)day (grain)", -2.871679624884012),
-                                    ("twoweek (grain)", -3.2771447329921766),
-                                    ("twominute (grain)", -3.2771447329921766),
-                                    ("second", -2.871679624884012),
-                                    ("integer (numeric)second (grain)", -3.2771447329921766),
-                                    ("twomonth (grain)", -3.2771447329921766),
-                                    ("onehour (grain)", -3.2771447329921766),
-                                    ("integer (numeric)year (grain)", -3.2771447329921766),
-                                    ("day", -2.583997552432231), ("year", -2.871679624884012),
-                                    ("integer (numeric)week (grain)", -2.871679624884012),
-                                    ("twoday (grain)", -3.2771447329921766),
-                                    ("hour", -2.871679624884012), ("month", -2.871679624884012),
-                                    ("integer (numeric)minute (grain)", -3.2771447329921766),
-                                    ("integer (numeric)month (grain)", -3.2771447329921766),
-                                    ("minute", -2.871679624884012),
-                                    ("twosecond (grain)", -3.2771447329921766),
-                                    ("integer (numeric)hour (grain)", -3.2771447329921766),
-                                    ("twoyear (grain)", -3.2771447329921766)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 8}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.1431008436406733, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -2.0149030205422647,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("three",
-        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}}),
-       ("ordinal (digits)",
-        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}}),
-       ("quarter (grain)",
-        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}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.540445040947149),
-                                    ("week (grain)named-month", -1.9459101490553135),
-                                    ("day (grain)intersect", -1.9459101490553135),
-                                    ("weekmonth", -1.540445040947149),
-                                    ("day (grain)named-month", -1.9459101490553135),
-                                    ("week (grain)intersect", -1.9459101490553135)],
-                               n = 4},
-                   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 = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("14th ordinalnamed-month", -1.791759469228055),
-                                    ("third ordinalnamed-month", -2.1972245773362196),
-                                    ("ordinal (digits)named-month", -1.2809338454620642),
-                                    ("month", -0.8109302162163288)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("morning",
-        Classifier{okData =
-                     ClassData{prior = -0.7731898882334817,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.6190392084062235,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("relative minutes to|till|before <integer> (hour-of-day)",
-        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> (latent time-of-day)",
-                                     -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2}}),
-       ("week-end",
-        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}}),
-       ("10th ordinal",
-        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}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.4403615823901665,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -2.3353749158170367),
-                                    ("<ordinal> (as hour)", -2.3353749158170367),
-                                    ("afternoon", -2.0476928433652555),
-                                    ("hour", -1.1314021114911006),
-                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
-                                     -2.3353749158170367)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.2702903297399117, unseen = -4.276666119016055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> <part-of-day>", -3.164067588373206),
-                                    ("<ordinal> (as hour)", -2.8763855159214247),
-                                    ("intersect", -3.56953269648137),
-                                    ("tomorrow", -2.653241964607215), ("day", -2.316769727986002),
-                                    ("afternoon", -2.653241964607215),
-                                    ("<day-of-month> (ordinal)", -3.164067588373206),
-                                    ("noon", -2.1832383353614793), ("hour", -1.08462604669337),
-                                    ("<datetime> - <datetime> (interval)", -3.164067588373206),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -3.164067588373206),
-                                    ("<hour-of-day> - <hour-of-day> (interval)",
-                                     -3.164067588373206)],
-                               n = 29}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.12783337150988489,
-                               unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
-                   koData =
-                     ClassData{prior = -2.120263536200091, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("9th ordinal",
-        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}}),
-       ("first ordinal",
-        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}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day-after-tomorrow (single-word)",
-        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}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<ordinal> (as hour)twenty", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("<ordinal> (as hour)fifteen", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (numeric)",
-                                     -0.8754687373538999),
-                                    ("hour", -0.8754687373538999)],
-                               n = 4}}),
-       ("23rd ordinal no space",
-        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 <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6286086594223742,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -3.044522437723423),
-                                    ("season", -2.128231705849268),
-                                    ("evening|night", -3.044522437723423),
-                                    ("day", -1.252762968495368), ("named-day", -1.6582280766035324),
-                                    ("hour", -1.9459101490553135),
-                                    ("week-end", -2.3513752571634776)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.7621400520468967,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.9444389791664407),
-                                    ("evening|night", -2.9444389791664407),
-                                    ("named-month", -1.2396908869280152),
-                                    ("day", -2.538973871058276), ("hour", -2.538973871058276),
-                                    ("month", -1.2396908869280152),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -2.538973871058276)],
-                               n = 14}}),
-       ("<named-month> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthfirst ordinal", -1.791759469228055),
-                                    ("named-month15th ordinal", -1.791759469228055),
-                                    ("month", -0.8754687373538999),
-                                    ("named-monthordinal (digits)", -1.3862943611198906)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("within <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/PL_XX.hs b/Duckling/Ranking/Classifiers/PL_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/PL_XX.hs
@@ -0,0 +1,2302 @@
+-- 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.PL_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("five",
+        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.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5997731097824868, unseen = -4.875197323201151,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 129},
+                   koData =
+                     ClassData{prior = -0.7961464200320919, unseen = -4.68213122712422,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 106}}),
+       ("exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -1.3862943611198906),
+                                    ("<integer> (latent time-of-day)", -1.791759469228055),
+                                    ("hour", -0.8754687373538999),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.6931471805599453),
+                                    ("day (grain)yesterday", -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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> <cycle> <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("third ordinalday (grain)October", -2.5257286443082556),
+                                    ("daymonth", -2.120263536200091),
+                                    ("quarteryear", -2.5257286443082556),
+                                    ("third ordinalday (grain)on <date>", -2.5257286443082556),
+                                    ("weekmonth", -1.4271163556401458),
+                                    ("ordinal (digits)quarter (grain)year", -2.5257286443082556),
+                                    ("first ordinalweek (grain)intersect", -2.120263536200091),
+                                    ("first ordinalweek (grain)October", -2.5257286443082556),
+                                    ("first ordinalweek (grain)on <date>", -2.120263536200091)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.8038127484474648, unseen = -4.919980925828125,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)after <time-of-day>", -3.8140425970679424),
+                                    ("dayhour", -2.966744736680739),
+                                    ("Wednesdayevening|night", -4.219507705176107),
+                                    ("<ordinal> (as hour)evening|night", -2.5147596129376812),
+                                    ("<ordinal> (as hour)on <date>", -4.219507705176107),
+                                    ("yesterdayevening|night", -4.219507705176107),
+                                    ("hourhour", -1.1990828190317442),
+                                    ("after <time-of-day>after <time-of-day>", -3.8140425970679424),
+                                    ("until <time-of-day>morning", -3.8140425970679424),
+                                    ("until <time-of-day>after <time-of-day>", -4.219507705176107),
+                                    ("minutehour", -4.219507705176107),
+                                    ("todayevening|night", -4.219507705176107),
+                                    ("at <time-of-day>evening|night", -4.219507705176107),
+                                    ("intersecton <date>", -4.219507705176107),
+                                    ("<integer> (latent time-of-day)this <part-of-day>",
+                                     -4.219507705176107),
+                                    ("hh:mmon <date>", -4.219507705176107),
+                                    ("<integer> (latent time-of-day)morning", -4.219507705176107),
+                                    ("at <time-of-day>on <date>", -4.219507705176107),
+                                    ("intersectmorning", -2.966744736680739),
+                                    ("<integer> (latent time-of-day)evening|night",
+                                     -2.966744736680739),
+                                    ("from <datetime> - <datetime> (interval)morning",
+                                     -4.219507705176107),
+                                    ("from <time-of-day> - <time-of-day> (interval)morning",
+                                     -4.219507705176107),
+                                    ("Mondaymorning", -4.219507705176107),
+                                    ("on <date>morning", -4.219507705176107),
+                                    ("at <time-of-day>morning", -3.8140425970679424),
+                                    ("tomorrowevening|night", -3.8140425970679424)],
+                               n = 47},
+                   koData =
+                     ClassData{prior = -0.593517339611104, unseen = -5.0689042022202315,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)after <time-of-day>", -4.3694478524670215),
+                                    ("dayhour", -2.018072595303544),
+                                    ("yearhour", -2.0668627594729756),
+                                    ("year (latent)on <date>", -4.3694478524670215),
+                                    ("<day-of-month> (ordinal)on <date>", -4.3694478524670215),
+                                    ("<time-of-day> - <time-of-day> (interval)morning",
+                                     -4.3694478524670215),
+                                    ("<day-of-month> (ordinal)evening|night", -2.6646997602285962),
+                                    ("by the end of <time>morning", -4.3694478524670215),
+                                    ("year (latent)evening|night", -3.1166848839716534),
+                                    ("hourhour", -2.423537703411708),
+                                    ("after <time-of-day>after <time-of-day>", -3.963982744358857),
+                                    ("<day-of-month> (ordinal)morning", -3.963982744358857),
+                                    ("<day-of-month> (ordinal)after <time-of-day>",
+                                     -3.270835563798912),
+                                    ("until <time-of-day>morning", -4.3694478524670215),
+                                    ("about <time-of-day>after <time-of-day>", -4.3694478524670215),
+                                    ("by <time>morning", -4.3694478524670215),
+                                    ("<integer> (latent time-of-day)after <time-of-day>",
+                                     -3.963982744358857),
+                                    ("<integer> (latent time-of-day)morning", -3.270835563798912),
+                                    ("secondhour", -3.1166848839716534),
+                                    ("intersectmorning", -3.270835563798912),
+                                    ("year (latent)morning", -2.6646997602285962),
+                                    ("year (latent)after <time-of-day>", -3.963982744358857),
+                                    ("at <time-of-day>after <time-of-day>", -4.3694478524670215)],
+                               n = 58}}),
+       ("today",
+        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}}),
+       ("mm/dd",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.13580154115906176,
+                               unseen = -4.787491742782046,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -1.4832866271072003),
+                                    ("<integer> (latent time-of-day)", -2.381228220313159),
+                                    ("about <time-of-day>", -4.085976312551584),
+                                    ("hh:mm", -3.6805112044434196),
+                                    ("<time-of-day> rano", -2.987364023883474),
+                                    ("hour", -0.827879774530102),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -2.2942168433235293),
+                                    ("minute", -3.169685580677429)],
+                               n = 55},
+                   koData =
+                     ClassData{prior = -2.063693184711697, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -1.8325814637483102),
+                                    ("<integer> (latent time-of-day)", -1.8325814637483102),
+                                    ("relative minutes after|past <integer> (hour-of-day)",
+                                     -2.5257286443082556),
+                                    ("hour", -1.1394342831883648),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -2.5257286443082556),
+                                    ("minute", -2.5257286443082556)],
+                               n = 8}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.159484249353372),
+                                    ("Saturday", -3.258096538021482),
+                                    ("Monday", -1.754019141245208), ("Friday", -2.5649493574615367),
+                                    ("day", -0.7731898882334817), ("Sunday", -2.005333569526114)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               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}}),
+       ("11th ordinal",
+        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}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -7.79615414697118e-2,
+                               unseen = -4.543294782270004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9231615807191553),
+                                    ("Thursday", -3.4339872044851463),
+                                    ("<time> <part-of-day>", -3.8394523125933104),
+                                    ("September", -3.4339872044851463),
+                                    ("October", -2.5866893440979424),
+                                    ("intersect", -2.0476928433652555),
+                                    ("Saturday", -3.4339872044851463),
+                                    ("next <cycle>", -3.146305132033365),
+                                    ("half to|till|before <integer> (hour-of-day)",
+                                     -3.8394523125933104),
+                                    ("day", -2.740840023925201), ("afternoon", -3.146305132033365),
+                                    ("this <cycle>", -2.9231615807191553),
+                                    ("year", -3.146305132033365), ("March", -3.8394523125933104),
+                                    ("hour", -2.3353749158170367), ("month", -1.6993861490970399),
+                                    ("minute", -3.8394523125933104),
+                                    ("this <time>", -3.8394523125933104)],
+                               n = 37},
+                   koData =
+                     ClassData{prior = -2.5902671654458267, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon", -1.8325814637483102), ("hour", -1.8325814637483102)],
+                               n = 3}}),
+       ("8th ordinal",
+        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}}),
+       ("October",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("month (grain)",
+        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}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -0.8649974374866046),
+                                    ("<integer> (latent time-of-day)", -2.2512917986064953),
+                                    ("hour", -0.7472144018302211)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -1.5040773967762742),
+                                    ("<integer> (latent time-of-day)", -1.0986122886681098),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3}}),
+       ("on a named-day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.2992829841302609),
+                                    ("Saturday", -1.2992829841302609),
+                                    ("day", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.4989911661189879,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("third ordinalTuesdayon <date>", -3.2771447329921766),
+                                    ("daymonth", -1.4853852637641216),
+                                    ("dayyear", -2.0243817644968085),
+                                    ("second ordinalWednesdayon <date>", -3.2771447329921766),
+                                    ("first ordinalWednesdayintersect", -2.871679624884012),
+                                    ("first ordinalWednesdayon <date>", -3.2771447329921766),
+                                    ("second ordinalWednesdayintersect", -2.871679624884012),
+                                    ("third ordinalintersectyear", -2.871679624884012),
+                                    ("first ordinalTuesdayon <date>", -3.2771447329921766),
+                                    ("first ordinalTuesdayOctober", -3.2771447329921766),
+                                    ("first ordinalintersectyear", -2.871679624884012),
+                                    ("third ordinalTuesdayintersect", -2.871679624884012),
+                                    ("second ordinalintersectyear", -2.871679624884012)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.9343092373768334,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("third ordinalTuesdaySeptember", -3.0204248861443626),
+                                    ("third ordinalTuesdayon <date>", -3.0204248861443626),
+                                    ("daymonth", -1.7676619176489945),
+                                    ("14th ordinalApril<integer> (latent time-of-day)",
+                                     -2.6149597780361984),
+                                    ("monthhour", -1.9218125974762528),
+                                    ("second ordinalWednesdayon <date>", -3.0204248861443626),
+                                    ("first ordinalWednesdayon <date>", -3.0204248861443626),
+                                    ("ordinal (digits)April<integer> (latent time-of-day)",
+                                     -2.327277705584417),
+                                    ("second ordinalWednesdayOctober", -3.0204248861443626),
+                                    ("first ordinalWednesdayOctober", -3.0204248861443626)],
+                               n = 11}}),
+       ("Wednesday",
+        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}}),
+       ("<ordinal> (as hour)",
+        Classifier{okData =
+                     ClassData{prior = -2.985296314968116e-2,
+                               unseen = -4.454347296253507,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("11th ordinal", -3.056356895370426),
+                                    ("8th ordinal", -3.3440389678222067),
+                                    ("21st ordinal no space", -3.7495040759303713),
+                                    ("20th ordinal", -3.7495040759303713),
+                                    ("third ordinal", -1.8035939268750578),
+                                    ("16th ordinal", -3.3440389678222067),
+                                    ("18th ordinal", -3.3440389678222067),
+                                    ("fifth ordinal", -3.7495040759303713),
+                                    ("seventh ordinal", -3.3440389678222067),
+                                    ("19th ordinal", -3.3440389678222067),
+                                    ("21-29th ordinal", -3.3440389678222067),
+                                    ("sixth ordinal", -3.3440389678222067),
+                                    ("15th ordinal", -3.3440389678222067),
+                                    ("second ordinal", -2.1400661634962708),
+                                    ("ordinal (digits)", -2.3632097148104805),
+                                    ("10th ordinal", -2.496741107435003),
+                                    ("9th ordinal", -2.3632097148104805),
+                                    ("first ordinal", -3.7495040759303713),
+                                    ("23rd ordinal no space", -3.7495040759303713)],
+                               n = 66},
+                   koData =
+                     ClassData{prior = -3.5263605246161616,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("20th ordinal", -2.3513752571634776),
+                                    ("first ordinal", -2.3513752571634776)],
+                               n = 2}}),
+       ("July",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("21st ordinal no space",
+        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}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -0.916290731874155),
+                                    ("third ordinalquarter (grain)", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.916290731874155),
+                                    ("quarter", -0.916290731874155)],
+                               n = 1}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.3189150921417123, unseen = -6.280395838960195,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tuesdayon <date>", -4.669083511731744),
+                                    ("Sundaylast <cycle>", -5.179909135497735),
+                                    ("Fridaynext <cycle>", -5.585374243605899),
+                                    ("<datetime> - <datetime> (interval)on <date>",
+                                     -5.179909135497735),
+                                    ("mm/dd<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -5.585374243605899),
+                                    ("<hour-of-day> - <hour-of-day> (interval)on <date>",
+                                     -5.179909135497735),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.179909135497735),
+                                    ("hourday", -3.7936147743778443),
+                                    ("dayhour", -2.7231733626764307),
+                                    ("daymonth", -3.7936147743778443),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyabsorption of , after named day",
+                                     -4.669083511731744),
+                                    ("TuesdaySeptember", -5.585374243605899),
+                                    ("monthyear", -3.100467593817899),
+                                    ("Wednesdayintersect", -5.179909135497735),
+                                    ("from <hour-of-day> - <hour-of-day> (interval)on a named-day",
+                                     -5.585374243605899),
+                                    ("from <time-of-day> - <time-of-day> (interval)on a named-day",
+                                     -5.585374243605899),
+                                    ("intersecthh:mm", -5.585374243605899),
+                                    ("from <datetime> - <datetime> (interval)on a named-day",
+                                     -5.585374243605899),
+                                    ("Wednesdaynext <cycle>", -5.179909135497735),
+                                    ("Tuesdaythis <cycle>", -5.585374243605899),
+                                    ("Saturday<time> <part-of-day>", -5.585374243605899),
+                                    ("Marchyear", -5.179909135497735),
+                                    ("Saturdayat <time-of-day>", -5.179909135497735),
+                                    ("on a named-dayat <time-of-day>", -5.179909135497735),
+                                    ("at <time-of-day>on a named-day", -5.585374243605899),
+                                    ("<time> <part-of-day>on a named-day", -5.179909135497735),
+                                    ("Wednesdayon <date>", -4.48676195493779),
+                                    ("on a named-day<time> <part-of-day>", -5.585374243605899),
+                                    ("last <day-of-week> of <time>year", -5.585374243605899),
+                                    ("today<time> <part-of-day>", -5.585374243605899),
+                                    ("todayat <time-of-day>", -5.585374243605899),
+                                    ("on <date>at <time-of-day>", -5.179909135497735),
+                                    ("dayday", -2.9463169139906404),
+                                    ("on <date><time> <part-of-day>", -5.585374243605899),
+                                    ("intersect by \",\"hh:mm", -4.669083511731744),
+                                    ("mm/ddat <time-of-day>", -4.892227063045954),
+                                    ("WednesdayOctober", -5.179909135497735),
+                                    ("last <cycle> <time>year", -4.669083511731744),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.892227063045954),
+                                    ("intersect<day-of-month> (non ordinal) <named-month>",
+                                     -4.892227063045954),
+                                    ("dayyear", -3.5704712230636346),
+                                    ("Wednesday<day-of-month>(ordinal) <named-month>",
+                                     -5.585374243605899),
+                                    ("Thursday<time> <part-of-day>", -5.179909135497735),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -5.179909135497735),
+                                    ("day-after-tomorrow (single-word)at <time-of-day>",
+                                     -5.585374243605899),
+                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
+                                     -4.081296846829625),
+                                    ("Tuesdaynext <cycle>", -5.585374243605899),
+                                    ("tomorrow<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -5.585374243605899),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.199079882486009),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.892227063045954),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.892227063045954),
+                                    ("tomorrowuntil <time-of-day>", -5.179909135497735),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -4.081296846829625),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect by \",\"",
+                                     -4.669083511731744),
+                                    ("TuesdayOctober", -5.585374243605899),
+                                    ("last <day-of-week> <time>year", -5.179909135497735),
+                                    ("Monday<day-of-month>(ordinal) <named-month>",
+                                     -5.179909135497735),
+                                    ("Mondaythis <cycle>", -5.585374243605899),
+                                    ("<time-of-day> ranoon <date>", -5.179909135497735),
+                                    ("on <date><time-of-day> rano", -5.585374243605899),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocytomorrow",
+                                     -5.585374243605899),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.585374243605899),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyFriday",
+                                     -4.669083511731744),
+                                    ("at <time-of-day>intersect", -5.179909135497735),
+                                    ("dayminute", -3.975936331171799),
+                                    ("<time-of-day> ranoon a named-day", -5.179909135497735),
+                                    ("from <hour-of-day> - <hour-of-day> (interval)on <date>",
+                                     -5.585374243605899),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.585374243605899),
+                                    ("intersectyear", -5.179909135497735),
+                                    ("on a named-day<time-of-day> rano", -5.585374243605899),
+                                    ("<ordinal> <cycle> of <time>year", -5.585374243605899),
+                                    ("minuteday", -2.386701126055218),
+                                    ("absorption of , after named dayintersect",
+                                     -5.585374243605899),
+                                    ("Saturday<time-of-day> rano", -5.585374243605899),
+                                    ("Octoberyear", -3.880626151367474),
+                                    ("yearhh:mm", -5.585374243605899),
+                                    ("at <time-of-day>intersect by \",\"", -5.179909135497735),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -5.179909135497735),
+                                    ("tomorrowexactly <time-of-day>", -4.892227063045954),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -5.179909135497735),
+                                    ("Septemberyear", -4.669083511731744),
+                                    ("at <time-of-day>on <date>", -5.585374243605899),
+                                    ("on <date>year", -4.199079882486009),
+                                    ("dayweek", -3.639464094550586),
+                                    ("Tuesdayin <duration>", -5.585374243605899),
+                                    ("<time> <part-of-day>on <date>", -5.179909135497735),
+                                    ("weekyear", -4.332611275110531),
+                                    ("<ordinal> <cycle> <time>year", -5.179909135497735),
+                                    ("tomorrowat <time-of-day>", -5.585374243605899),
+                                    ("tomorrow<time> <part-of-day>", -5.585374243605899),
+                                    ("at <time-of-day>Friday", -5.179909135497735),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect",
+                                     -4.669083511731744),
+                                    ("<named-month> <day-of-month> (ordinal)year",
+                                     -5.585374243605899),
+                                    ("tomorrow<time-of-day> rano", -5.585374243605899),
+                                    ("<datetime> - <datetime> (interval)on a named-day",
+                                     -5.179909135497735),
+                                    ("last <cycle> of <time>year", -5.179909135497735),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -5.585374243605899),
+                                    ("<time-of-day> - <time-of-day> (interval)on a named-day",
+                                     -5.179909135497735),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -5.179909135497735),
+                                    ("<hour-of-day> - <hour-of-day> (interval)on a named-day",
+                                     -5.179909135497735),
+                                    ("yearminute", -5.585374243605899)],
+                               n = 197},
+                   koData =
+                     ClassData{prior = -1.298053727675531, unseen = -5.662960480135946,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tuesdayon <date>", -4.966335035199676),
+                                    ("<time-of-day> ranoby <time>", -4.560869927091511),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -4.966335035199676),
+                                    ("Julyrelative minutes to|till|before <integer> (hour-of-day)",
+                                     -4.966335035199676),
+                                    ("dayhour", -3.867722746531566),
+                                    ("July<day-of-month> (non ordinal) <named-month>",
+                                     -4.966335035199676),
+                                    ("daymonth", -2.5684397624013053),
+                                    ("monthday", -4.560869927091511),
+                                    ("monthyear", -4.050044303325521),
+                                    ("Wednesdayintersect", -4.560869927091511),
+                                    ("<time> <part-of-day>until <time-of-day>", -4.560869927091511),
+                                    ("Marchyear", -4.273187854639731),
+                                    ("Wednesdayon <date>", -4.966335035199676),
+                                    ("absorption of , after named dayJuly", -4.966335035199676),
+                                    ("<time> <part-of-day><time> <part-of-day>",
+                                     -4.273187854639731),
+                                    ("mm/ddat <time-of-day>", -4.966335035199676),
+                                    ("hourhour", -4.050044303325521),
+                                    ("<time> <part-of-day>by <time>", -4.560869927091511),
+                                    ("dayyear", -3.713572066704308),
+                                    ("<time-of-day> ranoby the end of <time>", -4.560869927091511),
+                                    ("<named-month> <day-of-month> (non ordinal)until <time-of-day>",
+                                     -4.966335035199676),
+                                    ("monthminute", -4.966335035199676),
+                                    ("minutemonth", -4.273187854639731),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -4.966335035199676),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.966335035199676),
+                                    ("Aprilyear", -4.966335035199676),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect by \",\"",
+                                     -4.560869927091511),
+                                    ("after <time-of-day>at <time-of-day>", -4.966335035199676),
+                                    ("SundayMarch", -4.966335035199676),
+                                    ("hh:mmby the end of <time>", -4.966335035199676),
+                                    ("daysecond", -4.560869927091511),
+                                    ("<time> <part-of-day>by the end of <time>",
+                                     -4.560869927091511),
+                                    ("<time> <part-of-day><time-of-day> rano", -4.966335035199676),
+                                    ("<time-of-day> rano<time> <part-of-day>", -4.560869927091511),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -4.966335035199676),
+                                    ("August<day-of-month> (non ordinal) <named-month>",
+                                     -4.966335035199676),
+                                    ("at <time-of-day>intersect", -4.966335035199676),
+                                    ("dayminute", -4.560869927091511),
+                                    ("<named-month> <day-of-month> (non ordinal)by <time>",
+                                     -4.966335035199676),
+                                    ("intersectyear", -3.713572066704308),
+                                    ("intersectSeptember", -4.273187854639731),
+                                    ("minuteday", -3.2615869429612507),
+                                    ("hh:mmon <date>", -4.560869927091511),
+                                    ("at <time-of-day>intersect by \",\"", -4.966335035199676),
+                                    ("MondayMarch", -4.966335035199676),
+                                    ("<named-month> <day-of-month> (non ordinal)by the end of <time>",
+                                     -4.966335035199676),
+                                    ("tomorrowexactly <time-of-day>", -4.966335035199676),
+                                    ("hoursecond", -3.094532858298084),
+                                    ("absorption of , after named daySeptember",
+                                     -4.966335035199676),
+                                    ("hh:mmon a named-day", -4.560869927091511),
+                                    ("Sundayon <date>", -4.560869927091511),
+                                    ("absorption of , after named dayFebruary", -3.867722746531566),
+                                    ("hh:mmby <time>", -4.966335035199676),
+                                    ("tomorrowat <time-of-day>", -4.966335035199676),
+                                    ("minutesecond", -4.560869927091511),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocyintersect",
+                                     -4.560869927091511),
+                                    ("Tuesdayintersect", -4.560869927091511),
+                                    ("Sundayintersect", -4.560869927091511)],
+                               n = 74}}),
+       ("half after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("twenty",
+        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}}),
+       ("20th ordinal",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("a few",
+        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}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("third ordinalday (grain)October", -1.7047480922384253),
+                                    ("daymonth", -1.7047480922384253),
+                                    ("weekmonth", -1.2992829841302609),
+                                    ("first ordinalweek (grain)intersect", -1.7047480922384253),
+                                    ("first ordinalweek (grain)October", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("season",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("year (grain)",
+        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 <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6739764335716716),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.0794415416798357),
+                                    ("hh:mmhh:mm", -1.6739764335716716),
+                                    ("hourhour", -1.6739764335716716),
+                                    ("<time-of-day> rano<integer> (latent time-of-day)",
+                                     -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6739764335716716),
+                                    ("minutehour", -1.6739764335716716),
+                                    ("hh:mmintersect", -1.6739764335716716),
+                                    ("hh:mm<integer> (latent time-of-day)", -1.6739764335716716)],
+                               n = 4}}),
+       ("Saturday",
+        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}}),
+       ("from <hour-of-day> - <hour-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.6931471805599453),
+                                    ("hh:mmhh:mm", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.491654876777717),
+                                    ("month (grain)", -2.995732273553991),
+                                    ("year (grain)", -2.5902671654458267),
+                                    ("second", -2.995732273553991),
+                                    ("week (grain)", -1.491654876777717),
+                                    ("quarter", -2.3025850929940455), ("year", -2.5902671654458267),
+                                    ("second (grain)", -2.995732273553991),
+                                    ("month", -2.995732273553991),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               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.40546510810816444,
+                               unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6094379124341003),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.0149030205422647),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("hourhour", -1.6094379124341003),
+                                    ("<time-of-day> rano<integer> (latent time-of-day)",
+                                     -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minutehour", -1.2992829841302609),
+                                    ("hh:mm<integer> (latent time-of-day)", -1.2992829841302609)],
+                               n = 2}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (numeric)integer (numeric)", 0.0)],
+                               n = 1}}),
+       ("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 = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -8.004270767353637e-2),
+                                    ("one", -2.5649493574615367)],
+                               n = 24}}),
+       ("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}}),
+       ("evening|night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("third ordinal",
+        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}}),
+       ("Monday",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("<ordinal> quarter <year>",
+        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}}),
+       ("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}}),
+       ("16th ordinal",
+        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}}),
+       ("quarter to|till|before <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -1.791759469228055),
+                                    ("<integer> (latent time-of-day)", -1.791759469228055),
+                                    ("noon", -1.3862943611198906), ("hour", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -7.598590697792199e-2),
+                                    ("fifteen", -3.0204248861443626)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1466034741918754),
+                                    ("one", -2.3978952727983707)],
+                               n = 19}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.1631508098056809),
+                                    ("first ordinalWednesdayintersect", -2.0794415416798357),
+                                    ("second ordinalWednesdayintersect", -2.0794415416798357),
+                                    ("first ordinalTuesdayOctober", -2.0794415416798357),
+                                    ("third ordinalTuesdayintersect", -2.0794415416798357)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("third ordinalTuesdaySeptember", -1.9459101490553135),
+                                    ("daymonth", -1.252762968495368),
+                                    ("second ordinalWednesdayOctober", -1.9459101490553135),
+                                    ("first ordinalWednesdayOctober", -1.9459101490553135)],
+                               n = 3}}),
+       ("April",
+        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}}),
+       ("18th ordinal",
+        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}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.784189633918261,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fifth ordinal",
+        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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8873031950009028),
+                                    ("SundayMarch", -2.1400661634962708),
+                                    ("MondayMarch", -2.1400661634962708),
+                                    ("Sundayon <date>", -1.7346010553881064),
+                                    ("Sundayintersect", -1.7346010553881064)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("<unit-of-duration> as a duration",
+        Classifier{okData =
+                     ClassData{prior = -2.1226137135450447,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.7147984280919266),
+                                    ("hour (grain)", -2.8134107167600364),
+                                    ("second", -2.5257286443082556),
+                                    ("week (grain)", -1.7147984280919266),
+                                    ("day", -2.5257286443082556),
+                                    ("minute (grain)", -3.2188758248682006),
+                                    ("second (grain)", -2.5257286443082556),
+                                    ("hour", -2.8134107167600364), ("minute", -3.2188758248682006),
+                                    ("day (grain)", -2.5257286443082556)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -0.12751332029895956, unseen = -5.58724865840025,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0281482472922856),
+                                    ("month (grain)", -3.0985896589936988),
+                                    ("hour (grain)", -2.5877640352277083),
+                                    ("year (grain)", -2.750282964725483),
+                                    ("second", -3.9740583963475986),
+                                    ("week (grain)", -2.0281482472922856),
+                                    ("day", -2.4480020928525494), ("quarter", -3.3862717314454795),
+                                    ("minute (grain)", -3.0985896589936988),
+                                    ("year", -2.750282964725483),
+                                    ("second (grain)", -3.9740583963475986),
+                                    ("hour", -2.5877640352277083), ("month", -3.0985896589936988),
+                                    ("quarter (grain)", -3.3862717314454795),
+                                    ("minute", -3.0985896589936988),
+                                    ("day (grain)", -2.4480020928525494)],
+                               n = 125}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -1.5040773967762742),
+                                    ("evening|night", -1.0986122886681098),
+                                    ("hour", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("christmas 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}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.19671029424605427, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("15th ordinalFebruary", -2.9267394020670396),
+                                    ("8th ordinalAugust", -2.9267394020670396),
+                                    ("13th ordinalFebruary", -3.332204510175204),
+                                    ("first ordinalMarch", -2.9267394020670396),
+                                    ("ordinal (digits)February", -1.540445040947149),
+                                    ("third ordinalMarch", -3.332204510175204),
+                                    ("month", -0.8472978603872037),
+                                    ("ordinal (digits)March", -2.4159137783010487)],
+                               n = 23},
+                   koData =
+                     ClassData{prior = -1.7227665977411035, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("14th ordinalApril", -1.8971199848858813),
+                                    ("ordinal (digits)April", -1.6094379124341003),
+                                    ("month", -1.2039728043259361)],
+                               n = 5}}),
+       ("<duration> hence",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3121863889661687),
+                                    ("<unit-of-duration> as a duration", -1.8718021769015913),
+                                    ("day", -2.159484249353372), ("year", -2.5649493574615367),
+                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
+                                    ("month", -2.5649493574615367)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0794415416798357),
+                                    ("<unit-of-duration> as a duration", -0.9808292530117262),
+                                    ("day", -1.6739764335716716), ("year", -2.0794415416798357),
+                                    ("month", -2.0794415416798357)],
+                               n = 5}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11}}),
+       ("Friday",
+        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}}),
+       ("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.2876820724517809,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<cycle> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -0.6931471805599453),
+                                    ("dayday", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("half to|till|before <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Friday", -1.3862943611198906), ("day", -1.3862943611198906),
+                                    ("March", -1.3862943611198906), ("month", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("two",
+        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}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -2.456735772821304),
+                                    ("year (latent)", -2.8622008809294686),
+                                    ("<integer> (latent time-of-day)", -1.9459101490553135),
+                                    ("day", -2.456735772821304), ("year", -2.8622008809294686),
+                                    ("hh:mm", -2.8622008809294686),
+                                    ("<day-of-month> (ordinal)", -2.456735772821304),
+                                    ("noon", -2.8622008809294686),
+                                    ("<time-of-day> rano", -2.8622008809294686),
+                                    ("hour", -1.3581234841531944), ("minute", -2.8622008809294686)],
+                               n = 12}}),
+       ("seventh ordinal",
+        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}}),
+       ("half an hour",
+        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}}),
+       ("one",
+        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}}),
+       ("Sunday",
+        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}}),
+       ("afternoon",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second", -1.9459101490553135),
+                                    ("<unit-of-duration> as a duration", -1.540445040947149),
+                                    ("day", -1.9459101490553135), ("year", -1.9459101490553135),
+                                    ("<integer> <unit-of-duration>", -1.540445040947149),
+                                    ("minute", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<unit-of-duration> as a duration", -1.2039728043259361),
+                                    ("year", -1.6094379124341003), ("minute", -1.6094379124341003)],
+                               n = 2}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.5869650565820417),
+                                    ("year (grain)", -1.9924301646902063),
+                                    ("week (grain)", -1.5869650565820417),
+                                    ("day", -2.6855773452501515), ("quarter", -2.3978952727983707),
+                                    ("year", -1.9924301646902063),
+                                    ("quarter (grain)", -2.3978952727983707),
+                                    ("day (grain)", -2.6855773452501515)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        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}}),
+       ("last <cycle> <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -2.639057329615259),
+                                    ("daymonth", -1.540445040947149),
+                                    ("day (grain)intersect", -2.2335922215070942),
+                                    ("day (grain)on <date>", -2.2335922215070942),
+                                    ("weekmonth", -1.540445040947149),
+                                    ("week (grain)intersect", -2.2335922215070942),
+                                    ("week (grain)on <date>", -2.2335922215070942),
+                                    ("week (grain)September", -2.639057329615259)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.4423470353692043),
+                                    ("<ordinal> (as hour)", -1.5260563034950494),
+                                    ("<integer> (latent time-of-day)", -2.03688192726104),
+                                    ("hour", -0.9382696385929302),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -2.4423470353692043)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("relative minutes after|past <integer> (hour-of-day)",
+                                     -1.5040773967762742),
+                                    ("minute", -1.5040773967762742)],
+                               n = 1}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.14842000511827333,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.9810014688665833, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8472978603872037),
+                                    ("SundayMarch", -1.252762968495368),
+                                    ("Sundayintersect", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.7091475219063865, unseen = -4.59511985013459,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2823823856765264),
+                                    ("threemonth (grain)", -3.4863551900024623),
+                                    ("fifteenminute (grain)", -3.891820298110627),
+                                    ("a fewhour (grain)", -3.891820298110627),
+                                    ("integer (numeric)day (grain)", -2.793208009442517),
+                                    ("twoweek (grain)", -3.891820298110627),
+                                    ("fiveday (grain)", -3.891820298110627),
+                                    ("oneweek (grain)", -3.1986731175506815),
+                                    ("oneminute (grain)", -3.891820298110627),
+                                    ("integer (numeric)year (grain)", -3.891820298110627),
+                                    ("day", -2.505525936990736), ("year", -3.1986731175506815),
+                                    ("integer (numeric)week (grain)", -3.1986731175506815),
+                                    ("oneday (grain)", -3.891820298110627),
+                                    ("hour", -3.1986731175506815), ("month", -3.4863551900024623),
+                                    ("threeweek (grain)", -3.4863551900024623),
+                                    ("integer (numeric)minute (grain)", -2.793208009442517),
+                                    ("minute", -2.505525936990736),
+                                    ("integer (numeric)hour (grain)", -3.4863551900024623),
+                                    ("twoyear (grain)", -3.4863551900024623)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -0.6773988235918061, unseen = -4.61512051684126,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.8134107167600364),
+                                    ("threemonth (grain)", -3.912023005428146),
+                                    ("threehour (grain)", -3.912023005428146),
+                                    ("integer (numeric)day (grain)", -3.2188758248682006),
+                                    ("twoweek (grain)", -3.912023005428146),
+                                    ("twominute (grain)", -3.912023005428146),
+                                    ("second", -2.995732273553991),
+                                    ("threeday (grain)", -3.912023005428146),
+                                    ("threeyear (grain)", -3.912023005428146),
+                                    ("integer (numeric)second (grain)", -3.506557897319982),
+                                    ("twomonth (grain)", -3.912023005428146),
+                                    ("onehour (grain)", -3.912023005428146),
+                                    ("integer (numeric)year (grain)", -3.506557897319982),
+                                    ("threesecond (grain)", -3.912023005428146),
+                                    ("day", -2.659260036932778), ("year", -2.995732273553991),
+                                    ("threeminute (grain)", -3.912023005428146),
+                                    ("integer (numeric)week (grain)", -3.2188758248682006),
+                                    ("twoday (grain)", -3.912023005428146),
+                                    ("hour", -2.659260036932778), ("month", -3.2188758248682006),
+                                    ("threeweek (grain)", -3.912023005428146),
+                                    ("integer (numeric)minute (grain)", -3.506557897319982),
+                                    ("a fewday (grain)", -3.912023005428146),
+                                    ("integer (numeric)month (grain)", -3.912023005428146),
+                                    ("minute", -2.995732273553991),
+                                    ("twosecond (grain)", -3.912023005428146),
+                                    ("integer (numeric)hour (grain)", -3.2188758248682006),
+                                    ("fifteenhour (grain)", -3.912023005428146),
+                                    ("twoyear (grain)", -3.912023005428146)],
+                               n = 32}}),
+       ("19th ordinal",
+        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 = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.6931471805599453),
+                                    ("<unit-of-duration> as a durationtomorrow",
+                                     -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)<integer> (latent time-of-day)",
+                                     -1.7047480922384253),
+                                    ("fifteen<ordinal> (as hour)", -1.7047480922384253),
+                                    ("hour", -1.0116009116784799),
+                                    ("integer (numeric)<ordinal> (as hour)", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon", -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 2}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.2282586519809802, unseen = -4.727387818712341,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.02535169073515),
+                                    ("Wednesday<day-of-month> (non ordinal) <named-month>",
+                                     -3.332204510175204),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.619886582626985),
+                                    ("Friday<day-of-month> (non ordinal) <named-month>",
+                                     -4.02535169073515),
+                                    ("intersect by \",\"year", -4.02535169073515),
+                                    ("dayday", -1.4996230464268938),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.332204510175204),
+                                    ("intersect<day-of-month> (non ordinal) <named-month>",
+                                     -3.332204510175204),
+                                    ("dayyear", -3.109060958860994),
+                                    ("Wednesday<day-of-month>(ordinal) <named-month>",
+                                     -4.02535169073515),
+                                    ("<named-month> <day-of-month> (non ordinal)intersect",
+                                     -4.02535169073515),
+                                    ("Monday<day-of-month>(ordinal) <named-month>",
+                                     -3.619886582626985),
+                                    ("Saturday<day-of-month>(ordinal) <named-month>",
+                                     -4.02535169073515),
+                                    ("Fridayintersect", -4.02535169073515),
+                                    ("intersect by \",\"intersect", -4.02535169073515),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.02535169073515),
+                                    ("Sunday<day-of-month> (non ordinal) <named-month>",
+                                     -4.02535169073515),
+                                    ("dayminute", -2.9267394020670396),
+                                    ("intersectyear", -4.02535169073515),
+                                    ("minuteday", -2.772588722239781),
+                                    ("Sunday<day-of-month>(ordinal) <named-month>",
+                                     -3.109060958860994),
+                                    ("intersectintersect", -4.02535169073515),
+                                    ("Fridayintersect by \",\"", -3.619886582626985),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -3.332204510175204),
+                                    ("Monday<day-of-month> (non ordinal) <named-month>",
+                                     -3.332204510175204),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -3.619886582626985)],
+                               n = 39},
+                   koData =
+                     ClassData{prior = -1.589235205116581, unseen = -4.007333185232471,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.9095425048844386),
+                                    ("SundayFebruary", -3.295836866004329),
+                                    ("FridayJuly", -3.295836866004329),
+                                    ("FridaySeptember", -3.295836866004329),
+                                    ("WednesdayFebruary", -3.295836866004329),
+                                    ("minutemonth", -2.6026896854443837),
+                                    ("MondayFebruary", -2.6026896854443837),
+                                    ("intersectSeptember", -2.6026896854443837)],
+                               n = 10}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -4.652001563489282e-2,
+                               unseen = -3.1354942159291497,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
+                   koData =
+                     ClassData{prior = -3.0910424533583156,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("14th ordinal",
+        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}}),
+       ("21-29th ordinal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second ordinal", -0.6931471805599453),
+                                    ("first ordinal", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.6931471805599453),
+                                    ("<unit-of-duration> as a durationyesterday",
+                                     -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain)",
+        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}}),
+       ("13th ordinal",
+        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.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sundaylast <cycle>", -0.6931471805599453),
+                                    ("dayweek", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3121863889661687),
+                                    ("<unit-of-duration> as a duration", -1.8718021769015913),
+                                    ("day", -2.159484249353372), ("year", -2.5649493574615367),
+                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
+                                    ("month", -2.5649493574615367)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0794415416798357),
+                                    ("<unit-of-duration> as a duration", -0.9808292530117262),
+                                    ("day", -1.6739764335716716), ("year", -2.0794415416798357),
+                                    ("month", -2.0794415416798357)],
+                               n = 5}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.2809338454620642), ("Sunday", -1.791759469228055),
+                                    ("Tuesday", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> o'clock", -2.639057329615259),
+                                    ("intersect", -2.3513752571634776),
+                                    ("year (latent)", -2.128231705849268),
+                                    ("Monday", -3.044522437723423),
+                                    ("<integer> (latent time-of-day)", -2.128231705849268),
+                                    ("day", -1.791759469228055), ("Sunday", -2.639057329615259),
+                                    ("year", -2.128231705849268), ("hour", -1.791759469228055)],
+                               n = 16}}),
+       ("March",
+        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}}),
+       ("sixth ordinal",
+        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 = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("11th ordinal", -2.2335922215070942),
+                                    ("8th ordinal", -2.639057329615259),
+                                    ("third ordinal", -2.2335922215070942),
+                                    ("16th ordinal", -2.639057329615259),
+                                    ("second ordinal", -1.7227665977411035),
+                                    ("ordinal (digits)", -2.2335922215070942),
+                                    ("10th ordinal", -1.7227665977411035),
+                                    ("9th ordinal", -1.7227665977411035)],
+                               n = 20}}),
+       ("noon",
+        Classifier{okData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.8873031950009028,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -1.9924301646902063),
+                                    ("<integer> (latent time-of-day)", -1.9924301646902063),
+                                    ("<time-of-day> rano", -1.9924301646902063),
+                                    ("hour", -1.0116009116784799),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -2.3978952727983707)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -0.5306282510621704, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -2.2335922215070942),
+                                    ("<integer> (latent time-of-day)", -1.7227665977411035),
+                                    ("hh:mm", -2.639057329615259), ("noon", -2.2335922215070942),
+                                    ("<time-of-day> rano", -2.639057329615259),
+                                    ("hour", -1.0296194171811581), ("minute", -2.639057329615259)],
+                               n = 10}}),
+       ("<integer> and an half hours",
+        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}}),
+       ("<time-of-day> rano",
+        Classifier{okData =
+                     ClassData{prior = -0.10008345855698253,
+                               unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.0149030205422647),
+                                    ("<ordinal> (as hour)", -2.70805020110221),
+                                    ("<integer> (latent time-of-day)", -1.5040773967762742),
+                                    ("hh:mm", -3.1135153092103742),
+                                    ("until <time-of-day>", -2.70805020110221),
+                                    ("hour", -0.8622235106038793), ("minute", -3.1135153092103742)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -2.3513752571634776,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -1.7047480922384253),
+                                    ("until <time-of-day>", -1.7047480922384253),
+                                    ("hour", -1.2992829841302609)],
+                               n = 2}}),
+       ("after <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.5649493574615367),
+                                    ("Monday", -2.159484249353372), ("day", -0.9555114450274363),
+                                    ("March", -2.5649493574615367), ("month", -2.5649493574615367),
+                                    ("Tuesday", -1.3121863889661687)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("month (grain)", -1.6739764335716716),
+                                    ("year (grain)", -2.367123614131617),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("year", -2.367123614131617), ("month", -1.6739764335716716)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("day", -1.6739764335716716),
+                                    ("day (grain)", -1.6739764335716716)],
+                               n = 4}}),
+       ("christmas",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.793208009442517),
+                                    ("threemonth (grain)", -3.1986731175506815),
+                                    ("threehour (grain)", -3.1986731175506815),
+                                    ("integer (numeric)day (grain)", -3.1986731175506815),
+                                    ("second", -2.793208009442517),
+                                    ("threeday (grain)", -3.1986731175506815),
+                                    ("threeyear (grain)", -3.1986731175506815),
+                                    ("integer (numeric)second (grain)", -3.1986731175506815),
+                                    ("integer (numeric)year (grain)", -3.1986731175506815),
+                                    ("threesecond (grain)", -3.1986731175506815),
+                                    ("day", -2.505525936990736), ("year", -2.793208009442517),
+                                    ("threeminute (grain)", -3.1986731175506815),
+                                    ("integer (numeric)week (grain)", -3.1986731175506815),
+                                    ("hour", -2.793208009442517), ("month", -3.1986731175506815),
+                                    ("threeweek (grain)", -3.1986731175506815),
+                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
+                                    ("a fewday (grain)", -3.1986731175506815),
+                                    ("minute", -2.793208009442517),
+                                    ("integer (numeric)hour (grain)", -3.1986731175506815)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("15th ordinal",
+        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}}),
+       ("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 = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<ordinal> (as hour)", -2.456735772821304),
+                                    ("year (latent)", -2.8622008809294686),
+                                    ("<integer> (latent time-of-day)", -1.9459101490553135),
+                                    ("day", -2.456735772821304), ("year", -2.8622008809294686),
+                                    ("hh:mm", -2.8622008809294686),
+                                    ("<day-of-month> (ordinal)", -2.456735772821304),
+                                    ("noon", -2.8622008809294686),
+                                    ("<time-of-day> rano", -2.8622008809294686),
+                                    ("hour", -1.3581234841531944), ("minute", -2.8622008809294686)],
+                               n = 12}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.691243082785829),
+                                    ("number.number hours", -3.3843902633457743),
+                                    ("second", -2.9789251552376097),
+                                    ("<unit-of-duration> as a duration", -1.9980959022258835),
+                                    ("day", -2.9789251552376097),
+                                    ("half an hour", -3.3843902633457743),
+                                    ("<integer> <unit-of-duration>", -1.5125880864441827),
+                                    ("<integer> and an half hours", -3.3843902633457743),
+                                    ("hour", -2.2857779746776643), ("minute", -1.5125880864441827),
+                                    ("about <duration>", -2.9789251552376097)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -2.1972245773362196, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.4469189829363254),
+                                    ("<unit-of-duration> as a duration", -2.1400661634962708),
+                                    ("<integer> <unit-of-duration>", -1.7346010553881064)],
+                               n = 3}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.041453874828161, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6094379124341003),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("dayday", -2.120263536200091),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -2.120263536200091)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.4353180712578455, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -2.8622008809294686),
+                                    ("daymonth", -2.456735772821304),
+                                    ("about <time-of-day>noon", -2.8622008809294686),
+                                    ("minuteminute", -1.7635885922613588),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.8622008809294686),
+                                    ("until <time-of-day>noon", -2.8622008809294686),
+                                    ("hh:mmhh:mm", -2.8622008809294686),
+                                    ("hourhour", -1.9459101490553135),
+                                    ("hh:mmintersect", -1.9459101490553135),
+                                    ("at <time-of-day>noon", -2.8622008809294686),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -2.8622008809294686)],
+                               n = 11}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second ordinal",
+        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}}),
+       ("<time-of-day> popo\322udniu/wieczorem/w nocy",
+        Classifier{okData =
+                     ClassData{prior = -1.5037877364540559e-2,
+                               unseen = -4.962844630259907,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("exactly <time-of-day>", -4.2626798770413155),
+                                    ("at <time-of-day>", -2.4709204078132605),
+                                    ("<ordinal> (as hour)", -1.5218398531161146),
+                                    ("<integer> (latent time-of-day)", -2.01138807843482),
+                                    ("about <time-of-day>", -4.2626798770413155),
+                                    ("hh:mm", -3.857214768933151),
+                                    ("until <time-of-day>", -4.2626798770413155),
+                                    ("hour", -0.812692331209728), ("minute", -3.3463891451671604),
+                                    ("after <time-of-day>", -3.857214768933151)],
+                               n = 66},
+                   koData =
+                     ClassData{prior = -4.204692619390966, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.791759469228055),
+                                    ("hour", -1.791759469228055)],
+                               n = 1}}),
+       ("fifteen",
+        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-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.4469189829363254, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.2682639865946794,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about <time-of-day>noon", -2.9444389791664407),
+                                    ("relative minutes to|till|before <integer> (hour-of-day)<integer> (latent time-of-day)",
+                                     -2.9444389791664407),
+                                    ("minuteminute", -2.9444389791664407),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.9444389791664407),
+                                    ("until <time-of-day>noon", -2.9444389791664407),
+                                    ("hh:mmhh:mm", -2.9444389791664407),
+                                    ("hourhour", -1.6916760106710724),
+                                    ("minutehour", -1.6916760106710724),
+                                    ("at <time-of-day>noon", -2.9444389791664407),
+                                    ("<time-of-day> rano<integer> (latent time-of-day)",
+                                     -2.9444389791664407),
+                                    ("until <time-of-day><integer> (latent time-of-day)",
+                                     -2.9444389791664407),
+                                    ("hh:mm<integer> (latent time-of-day)", -1.845826690498331)],
+                               n = 13}}),
+       ("<hour-of-day> - <hour-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.5040773967762742,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.2809338454620642),
+                                    ("hh:mmhh:mm", -1.2809338454620642)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about <time-of-day>noon", -2.9444389791664407),
+                                    ("minuteminute", -2.9444389791664407),
+                                    ("<time-of-day> rano<time-of-day> rano", -2.9444389791664407),
+                                    ("until <time-of-day>noon", -2.9444389791664407),
+                                    ("hh:mmhh:mm", -2.9444389791664407),
+                                    ("hourhour", -0.9985288301111273),
+                                    ("after <time-of-day>noon", -2.538973871058276),
+                                    ("at <time-of-day>noon", -2.9444389791664407),
+                                    ("<ordinal> (as hour)noon", -1.845826690498331),
+                                    ("<integer> (latent time-of-day)noon", -2.538973871058276)],
+                               n = 14}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.583997552432231),
+                                    ("integer (numeric)day (grain)", -2.871679624884012),
+                                    ("twoweek (grain)", -3.2771447329921766),
+                                    ("twominute (grain)", -3.2771447329921766),
+                                    ("second", -2.871679624884012),
+                                    ("integer (numeric)second (grain)", -3.2771447329921766),
+                                    ("twomonth (grain)", -3.2771447329921766),
+                                    ("onehour (grain)", -3.2771447329921766),
+                                    ("integer (numeric)year (grain)", -3.2771447329921766),
+                                    ("day", -2.583997552432231), ("year", -2.871679624884012),
+                                    ("integer (numeric)week (grain)", -2.871679624884012),
+                                    ("twoday (grain)", -3.2771447329921766),
+                                    ("hour", -2.871679624884012), ("month", -2.871679624884012),
+                                    ("integer (numeric)minute (grain)", -3.2771447329921766),
+                                    ("integer (numeric)month (grain)", -3.2771447329921766),
+                                    ("minute", -2.871679624884012),
+                                    ("twosecond (grain)", -3.2771447329921766),
+                                    ("integer (numeric)hour (grain)", -3.2771447329921766),
+                                    ("twoyear (grain)", -3.2771447329921766)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129, unseen = -3.871201010907891,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -1.9042374526547454),
+                                    ("Marchinteger (numeric)", -2.463853240590168),
+                                    ("Aprilinteger (numeric)", -3.1570004211501135),
+                                    ("month", -0.8056251639866356),
+                                    ("Februaryinteger (numeric)", -1.9042374526547454),
+                                    ("Septemberinteger (numeric)", -3.1570004211501135),
+                                    ("Julyinteger (numeric)", -2.463853240590168)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Marchinteger (numeric)", -2.4423470353692043),
+                                    ("Aprilinteger (numeric)", -1.3437347467010947),
+                                    ("month", -0.9382696385929302),
+                                    ("Julyinteger (numeric)", -2.03688192726104)],
+                               n = 8}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.1431008436406733,
+                               unseen = -3.5263605246161616,
+                               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},
+                   koData =
+                     ClassData{prior = -2.0149030205422647,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)August", -1.7047480922384253),
+                                    ("month", -1.2992829841302609),
+                                    ("integer (numeric)July", -1.7047480922384253)],
+                               n = 2}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -2.3978952727983707),
+                                    ("Monday", -1.9924301646902063), ("day", -0.7884573603642702),
+                                    ("Tuesday", -1.1451323043030026)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three",
+        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}}),
+       ("ordinal (digits)",
+        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}}),
+       ("quarter (grain)",
+        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}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.9459101490553135),
+                                    ("daymonth", -1.540445040947149),
+                                    ("day (grain)intersect", -1.9459101490553135),
+                                    ("weekmonth", -1.540445040947149),
+                                    ("week (grain)intersect", -1.9459101490553135),
+                                    ("week (grain)September", -1.9459101490553135)],
+                               n = 4},
+                   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 = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("14th ordinalApril", -1.845826690498331),
+                                    ("third ordinalMarch", -2.2512917986064953),
+                                    ("ordinal (digits)April", -1.55814461804655),
+                                    ("month", -0.8649974374866046),
+                                    ("ordinal (digits)March", -2.2512917986064953)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        Classifier{okData =
+                     ClassData{prior = -0.7731898882334817,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -0.6190392084062235,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("relative minutes to|till|before <integer> (hour-of-day)",
+        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> (latent time-of-day)",
+                                     -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("week-end",
+        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}}),
+       ("10th ordinal",
+        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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.2367626271489267,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.268683541318364),
+                                    ("<ordinal> (as hour)", -2.268683541318364),
+                                    ("afternoon", -1.9810014688665833),
+                                    ("hour", -1.0647107369924282),
+                                    ("<time-of-day> popo\322udniu/wieczorem/w nocy",
+                                     -2.268683541318364)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.3429447511268303, unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> <part-of-day>", -2.908720896564361),
+                                    ("intersect", -3.3141860046725258),
+                                    ("tomorrow", -2.3978952727983707), ("day", -2.0614230361771577),
+                                    ("afternoon", -2.3978952727983707),
+                                    ("<day-of-month> (ordinal)", -2.908720896564361),
+                                    ("noon", -1.927891643552635), ("hour", -1.1741198411762548),
+                                    ("<hour-of-day> - <hour-of-day> (interval)",
+                                     -2.908720896564361)],
+                               n = 22}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.12783337150988489,
+                               unseen = -3.1780538303479458,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
+                   koData =
+                     ClassData{prior = -2.120263536200091, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("9th ordinal",
+        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}}),
+       ("first ordinal",
+        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}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day-after-tomorrow (single-word)",
+        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}}),
+       ("<hour-of-day> <integer> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>fifteen", -1.252762968495368),
+                                    ("at <time-of-day>twenty", -1.252762968495368),
+                                    ("hour", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("23rd ordinal no space",
+        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 <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6286086594223742, unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -3.1986731175506815),
+                                    ("on <date>", -3.1986731175506815),
+                                    ("Wednesday", -3.1986731175506815),
+                                    ("season", -2.2823823856765264),
+                                    ("Saturday", -3.1986731175506815),
+                                    ("evening|night", -3.1986731175506815),
+                                    ("Monday", -3.1986731175506815),
+                                    ("Friday", -3.1986731175506815), ("day", -1.4069136483226263),
+                                    ("Sunday", -3.1986731175506815), ("hour", -2.1000608288825715),
+                                    ("Tuesday", -3.1986731175506815),
+                                    ("week-end", -2.505525936990736)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.7621400520468967, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -3.1135153092103742),
+                                    ("evening|night", -3.1135153092103742),
+                                    ("April", -2.70805020110221), ("day", -2.70805020110221),
+                                    ("February", -1.6094379124341003), ("hour", -2.70805020110221),
+                                    ("month", -1.4087672169719492),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -2.70805020110221)],
+                               n = 14}}),
+       ("<named-month> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("February15th ordinal", -1.791759469228055),
+                                    ("Marchfirst ordinal", -1.791759469228055),
+                                    ("month", -0.8754687373538999),
+                                    ("Marchordinal (digits)", -1.3862943611198906)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("within <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August",
+        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}})]
diff --git a/Duckling/Ranking/Classifiers/PT.hs b/Duckling/Ranking/Classifiers/PT.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/PT.hs
+++ /dev/null
@@ -1,1279 +0,0 @@
--- 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.PT (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<cycle> (que vem)",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("semana (grain)", -1.540445040947149),
-                                    ("mes (grain)", -1.9459101490553135),
-                                    ("year", -1.9459101490553135),
-                                    ("ano (grain)", -1.9459101490553135),
-                                    ("month", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("semana (grain)", -1.791759469228055),
-                                    ("mes (grain)", -1.791759469228055),
-                                    ("year", -1.791759469228055),
-                                    ("ano (grain)", -1.791759469228055),
-                                    ("month", -1.791759469228055)],
-                               n = 3}}),
-       ("midnight",
-        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}}),
-       ("<dim time> da tarde",
-        Classifier{okData =
-                     ClassData{prior = -0.24686007793152578, unseen = -4.0943445622221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> and half", -2.468099531471619),
-                                    ("time-of-day (latent)", -2.9789251552376097),
-                                    ("<hour-of-day> and <relative minutes>", -2.1316272948504063),
-                                    ("hour", -2.468099531471619),
-                                    ("<hour-of-day> and quinze", -2.468099531471619),
-                                    ("minute", -0.9864949905474035),
-                                    ("\224s <time-of-day>", -1.7749523509116738)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -1.5198257537444133,
-                               unseen = -3.1780538303479458,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -1.3437347467010947),
-                                    ("time-of-day (latent)", -2.03688192726104),
-                                    ("year", -1.3437347467010947), ("hour", -2.03688192726104)],
-                               n = 7}}),
-       ("de <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.252762968495368),
-                                    ("hour", -0.8472978603872037),
-                                    ("\224s <time-of-day>", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.6427163269330534, unseen = -4.143134726391533,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 61},
-                   koData =
-                     ClassData{prior = -0.7462570058738938, unseen = -4.04305126783455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 55}}),
-       ("the day before yesterday",
-        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(:|.|h)mm (time-of-day)",
-        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}}),
-       ("<named-month|named-day> past",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("proximo <cycle> ",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("semana (grain)", -1.540445040947149),
-                                    ("mes (grain)", -1.9459101490553135),
-                                    ("year", -1.9459101490553135),
-                                    ("ano (grain)", -1.9459101490553135),
-                                    ("month", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("semana (grain)", -1.791759469228055),
-                                    ("mes (grain)", -1.791759469228055),
-                                    ("year", -1.791759469228055),
-                                    ("ano (grain)", -1.791759469228055),
-                                    ("month", -1.791759469228055)],
-                               n = 3}}),
-       ("dd[/-]mm",
-        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}}),
-       ("intersect by `da` or `de`",
-        Classifier{okData =
-                     ClassData{prior = -0.6443570163905132, unseen = -4.31748811353631,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day of month (1st)named-month", -3.20545280453606),
-                                    ("daymonth", -3.20545280453606),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
-                                     -3.6109179126442243),
-                                    ("<day-of-month> de <named-month>intersect",
-                                     -3.6109179126442243),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
-                                     -3.6109179126442243),
-                                    ("dayday", -2.917770732084279),
-                                    ("dayyear", -1.6650077635889111),
-                                    ("named-dayproximo <cycle> ", -3.6109179126442243),
-                                    ("dd-dd <month>(interval)year", -3.6109179126442243),
-                                    ("named-day<cycle> (que vem)", -3.6109179126442243),
-                                    ("two time tokens separated by \",\"2year", -3.20545280453606),
-                                    ("intersectyear", -3.6109179126442243),
-                                    ("<day-of-month> de <named-month>year", -2.2246235515243336),
-                                    ("two time tokens separated by \",\"year", -3.20545280453606),
-                                    ("dayweek", -2.917770732084279),
-                                    ("named-day<cycle> passado", -3.6109179126442243)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -0.7444404749474959,
-                               unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> <integer> (as relative minutes)intersect",
-                                     -3.5553480614894135),
-                                    ("monthday", -2.8622008809294686),
-                                    ("monthyear", -2.05127066471314),
-                                    ("hourmonth", -3.1498829533812494),
-                                    ("monthmonth", -3.5553480614894135),
-                                    ("dayyear", -3.5553480614894135),
-                                    ("minutemonth", -2.8622008809294686),
-                                    ("named-monthyear", -2.05127066471314),
-                                    ("de <datetime> - <datetime> (interval)named-month",
-                                     -3.5553480614894135),
-                                    ("\224s <time-of-day>named-month", -3.1498829533812494),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -3.5553480614894135),
-                                    ("<day-of-month> de <named-month>year", -3.5553480614894135),
-                                    ("intersect by `da` or `de`year", -3.5553480614894135),
-                                    ("named-monthtwo time tokens separated by \",\"2",
-                                     -3.5553480614894135),
-                                    ("named-monthintersect", -3.5553480614894135),
-                                    ("<hour-of-day> <integer> (as relative minutes)intersect by `da` or `de`",
-                                     -3.5553480614894135),
-                                    ("minuteyear", -3.5553480614894135),
-                                    ("named-monthtwo time tokens separated by \",\"",
-                                     -3.5553480614894135)],
-                               n = 19}}),
-       ("<hour-of-day> and half",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.4816045409242156),
-                                    ("noon", -2.3978952727983707), ("hour", -0.7884573603642702),
-                                    ("\224s <time-of-day>", -1.4816045409242156)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("semana (grain)",
-        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}}),
-       ("two time tokens separated by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersectnamed-day", -2.772588722239781),
-                                    ("intersect by `da` or `de`named-day", -2.772588722239781),
-                                    ("dayday", -1.1631508098056809),
-                                    ("de <year>named-day", -2.772588722239781),
-                                    ("named-dayintersect", -2.367123614131617),
-                                    ("named-dayintersect by `da` or `de`", -2.367123614131617),
-                                    ("yearnamed-day", -2.772588722239781),
-                                    ("named-day<day-of-month> de <named-month>",
-                                     -2.0794415416798357),
-                                    ("yearday", -2.367123614131617)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.8718021769015913, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.540445040947149),
-                                    ("intersectnamed-day", -1.9459101490553135),
-                                    ("intersect by `da` or `de`named-day", -1.9459101490553135)],
-                               n = 2}}),
-       ("ordinals (primeiro..10)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
-       ("<day-of-month> de <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -7.410797215372185e-2,
-                               unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..15)named-month", -1.927891643552635),
-                                    ("integer (numeric)named-month", -1.0116009116784799),
-                                    ("month", -0.7114963192281418)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -2.639057329615259, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.8472978603872037),
-                                    ("month", -0.8472978603872037)],
-                               n = 2}}),
-       ("<time-of-day> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.33270575382573614,
-                               unseen = -4.584967478670572,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> and quinzeafternoon", -2.9652730660692823),
-                                    ("<day-of-month> de <named-month>morning", -3.8815637979434374),
-                                    ("dayhour", -3.4760986898352733),
-                                    ("\224s <time-of-day>morning", -3.188416617383492),
-                                    ("hourhour", -1.8021222562636017),
-                                    ("<hour-of-day> and halfafternoon", -2.9652730660692823),
-                                    ("minutehour", -1.483668525145067),
-                                    ("time-of-day (latent)morning", -3.188416617383492),
-                                    ("time-of-day (latent)evening", -3.4760986898352733),
-                                    ("\224s <time-of-day>afternoon", -2.2721258855093374),
-                                    ("dia <day-of-month> de <named-month>morning",
-                                     -3.8815637979434374),
-                                    ("time-of-day (latent)afternoon", -3.4760986898352733),
-                                    ("<hour-of-day> and <relative minutes>afternoon",
-                                     -2.62880082944807),
-                                    ("intersectmorning", -3.8815637979434374),
-                                    ("\224s <time-of-day>evening", -3.4760986898352733)],
-                               n = 38},
-                   koData =
-                     ClassData{prior = -1.262241712449912, unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -1.4469189829363254),
-                                    ("monthhour", -3.2386784521643803),
-                                    ("hourhour", -2.5455312716044354),
-                                    ("time-of-day (latent)morning", -3.2386784521643803),
-                                    ("year (latent)afternoon", -2.1400661634962708),
-                                    ("named-monthmorning", -3.2386784521643803),
-                                    ("year (latent)evening", -2.833213344056216),
-                                    ("time-of-day (latent)afternoon", -2.833213344056216),
-                                    ("year (latent)morning", -2.322387720290225)],
-                               n = 15}}),
-       ("de <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.791759469228055),
-                                    ("monthyear", -1.791759469228055),
-                                    ("monthhour", -1.791759469228055),
-                                    ("named-monthyear (latent)", -1.791759469228055),
-                                    ("named-monthtime-of-day (latent)", -1.791759469228055),
-                                    ("named-month<day-of-month> de <named-month>",
-                                     -1.791759469228055)],
-                               n = 3}}),
-       ("<time-of-day> horas",
-        Classifier{okData =
-                     ClassData{prior = -0.7731898882334817,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.5040773967762742),
-                                    ("hour", -0.9444616088408514),
-                                    ("depois das <time-of-day>", -1.791759469228055),
-                                    ("\224s <time-of-day>", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.6190392084062235, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2039728043259361),
-                                    ("<hour-of-day> and <relative minutes>", -2.3025850929940455),
-                                    ("hour", -1.0498221244986778), ("minute", -2.3025850929940455),
-                                    ("\224s <time-of-day>", -2.3025850929940455)],
-                               n = 7}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -5.062595033026967,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.9576335166801986),
-                                    ("dayhour", -2.4171884757330493),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
-                                     -4.363098624788362),
-                                    ("nowquinze para as <hour-of-day> (as relative minutes)",
-                                     -4.363098624788362),
-                                    ("intersectnamed-day", -4.363098624788362),
-                                    ("now\224s <time-of-day>", -3.9576335166801986),
-                                    ("<day-of-month> de <named-month>intersect",
-                                     -4.363098624788362),
-                                    ("now<hour-of-day> and 3/4", -4.363098624788362),
-                                    ("intersect by `da` or `de`named-day", -4.363098624788362),
-                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
-                                     -4.363098624788362),
-                                    ("dayday", -2.8590212280120886),
-                                    ("hourhour", -4.363098624788362),
-                                    ("named-day\224s <time-of-day>", -4.363098624788362),
-                                    ("dayyear", -2.348195604246098),
-                                    ("minutehour", -3.1103356562929947),
-                                    ("<hour-of-day> and quinzein the <part-of-day>",
-                                     -3.9576335166801986),
-                                    ("de <year>named-day", -4.363098624788362),
-                                    ("now<hour-of-day> and <relative minutes>", -4.363098624788362),
-                                    ("named-dayin the <part-of-day>", -4.363098624788362),
-                                    ("tomorrow<time-of-day> horas", -3.9576335166801986),
-                                    ("now<integer> para as <hour-of-day> (as relative minutes)",
-                                     -4.363098624788362),
-                                    ("\224s <time-of-day>in the <part-of-day>",
-                                     -3.6699514442284173),
-                                    ("named-dayintersect", -4.363098624788362),
-                                    ("named-dayamanh\227 pela <part-of-day>", -4.363098624788362),
-                                    ("dayminute", -3.1103356562929947),
-                                    ("named-dayintersect by `da` or `de`", -4.363098624788362),
-                                    ("yearnamed-day", -4.363098624788362),
-                                    ("dd-dd <month>(interval)de <year>", -4.363098624788362),
-                                    ("named-day<day-of-month> de <named-month>",
-                                     -4.363098624788362),
-                                    ("named-day<time-of-day> <part-of-day>", -4.363098624788362),
-                                    ("dia <day-of-month> de <named-month>in the <part-of-day>",
-                                     -3.9576335166801986),
-                                    ("yearday", -3.9576335166801986),
-                                    ("named-day<dim time> da manha", -4.363098624788362),
-                                    ("two time tokens separated by \",\"de <year>",
-                                     -3.9576335166801986),
-                                    ("dd[/-]mmyear", -4.363098624788362),
-                                    ("<day-of-month> de <named-month>de <year>",
-                                     -2.976804263668472),
-                                    ("tomorrowdepois das <time-of-day>", -3.9576335166801986),
-                                    ("<hour-of-day> and <relative minutes>in the <part-of-day>",
-                                     -3.9576335166801986),
-                                    ("two time tokens separated by \",\"2de <year>",
-                                     -3.9576335166801986),
-                                    ("intersectde <year>", -4.363098624788362)],
-                               n = 50},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -4.68213122712422,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.979681653901961),
-                                    ("dayhour", -3.5742165457937967),
-                                    ("monthday", -2.8810693652338513),
-                                    ("named-month\224s <time-of-day>", -3.979681653901961),
-                                    ("monthyear", -2.4756042571256867),
-                                    ("intersectnamed-day", -3.979681653901961),
-                                    ("now\224s <time-of-day>", -3.5742165457937967),
-                                    ("<time-of-day> am|pm<day-of-month> de <named-month>",
-                                     -3.979681653901961),
-                                    ("intersect by `da` or `de`named-day", -3.979681653901961),
-                                    ("monthhour", -3.2865344733420154),
-                                    ("dayyear", -3.979681653901961),
-                                    ("now<hour-of-day> and <relative minutes>", -3.979681653901961),
-                                    ("daysecond", -3.979681653901961),
-                                    ("named-dayright now", -3.979681653901961),
-                                    ("dayminute", -3.5742165457937967),
-                                    ("named-monthde <year>", -2.4756042571256867),
-                                    ("named-monthin the <part-of-day>", -3.5742165457937967),
-                                    ("named-monthtwo time tokens separated by \",\"2",
-                                     -3.979681653901961),
-                                    ("intersect by `da` or `de`de <year>", -3.979681653901961),
-                                    ("named-monthintersect", -3.979681653901961),
-                                    ("<day-of-month> de <named-month>\224s <time-of-day>",
-                                     -3.979681653901961),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -3.979681653901961),
-                                    ("<day-of-month> de <named-month>de <year>",
-                                     -3.979681653901961),
-                                    ("minuteyear", -3.5742165457937967),
-                                    ("named-monthtwo time tokens separated by \",\"",
-                                     -3.979681653901961)],
-                               n = 25}}),
-       ("season",
-        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}}),
-       ("minutos (grain)",
-        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}}),
-       ("two time tokens separated by \",\"2",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersectnamed-day", -2.772588722239781),
-                                    ("intersect by `da` or `de`named-day", -2.772588722239781),
-                                    ("dayday", -1.1631508098056809),
-                                    ("de <year>named-day", -2.772588722239781),
-                                    ("named-dayintersect", -2.367123614131617),
-                                    ("named-dayintersect by `da` or `de`", -2.367123614131617),
-                                    ("yearnamed-day", -2.772588722239781),
-                                    ("named-day<day-of-month> de <named-month>",
-                                     -2.0794415416798357),
-                                    ("yearday", -2.367123614131617)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -1.8718021769015913, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.540445040947149),
-                                    ("intersectnamed-day", -1.9459101490553135),
-                                    ("intersect by `da` or `de`named-day", -1.9459101490553135)],
-                               n = 2}}),
-       ("year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.3217558399823195),
-                                    ("number (0..15)", -0.5108256237659907),
-                                    ("number (20..90)", -2.0149030205422647)],
-                               n = 12}}),
-       ("n[ao] <date>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dia <day-of-month> (non ordinal)", -1.252762968495368),
-                                    ("day", -0.8472978603872037),
-                                    ("named-day", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("amanh\227 pela <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.3184537311185346,
-                               unseen = -4.6443908991413725,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<hour-of-day> and quinzeafternoon", -3.0252910757955354),
-                                    ("<day-of-month> de <named-month>morning", -3.9415818076696905),
-                                    ("dayhour", -3.0252910757955354),
-                                    ("\224s <time-of-day>morning", -3.248434627109745),
-                                    ("hourhour", -1.8621402659898547),
-                                    ("<hour-of-day> and halfafternoon", -3.0252910757955354),
-                                    ("minutehour", -1.54368653487132),
-                                    ("tomorrowevening", -3.9415818076696905),
-                                    ("time-of-day (latent)morning", -3.248434627109745),
-                                    ("time-of-day (latent)evening", -3.536116699561526),
-                                    ("\224s <time-of-day>afternoon", -2.33214389523559),
-                                    ("dia <day-of-month> de <named-month>morning",
-                                     -3.9415818076696905),
-                                    ("yesterdayevening", -3.9415818076696905),
-                                    ("time-of-day (latent)afternoon", -3.536116699561526),
-                                    ("<hour-of-day> and <relative minutes>afternoon",
-                                     -2.6888188391743224),
-                                    ("intersectmorning", -3.9415818076696905),
-                                    ("\224s <time-of-day>evening", -3.536116699561526)],
-                               n = 40},
-                   koData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -1.4853852637641216),
-                                    ("monthhour", -3.2771447329921766),
-                                    ("hourhour", -2.583997552432231),
-                                    ("time-of-day (latent)morning", -3.2771447329921766),
-                                    ("year (latent)afternoon", -2.178532444324067),
-                                    ("named-monthmorning", -3.2771447329921766),
-                                    ("year (latent)evening", -2.871679624884012),
-                                    ("time-of-day (latent)afternoon", -2.871679624884012),
-                                    ("year (latent)morning", -2.3608540011180215)],
-                               n = 15}}),
-       ("dentro de <duration>",
-        Classifier{okData =
-                     ClassData{prior = -2.772588722239781, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration>", -1.6094379124341003),
-                                    ("hour", -1.6094379124341003)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9444389791664407), ("second", -2.9444389791664407),
-                                    ("day", -2.538973871058276), ("year", -2.538973871058276),
-                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
-                                    ("hour", -2.2512917986064953), ("month", -2.9444389791664407),
-                                    ("minute", -1.845826690498331)],
-                               n = 15}}),
-       ("dia <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        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}}),
-       ("dia <day-of-month> de <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("evening", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number (0..15)",
-        Classifier{okData =
-                     ClassData{prior = -1.9048194970694474e-2,
-                               unseen = -3.9889840465642745,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 52},
-                   koData =
-                     ClassData{prior = -3.970291913552122, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("antes das <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midnight", -1.2992829841302609),
-                                    ("noon", -1.2992829841302609), ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("dd-dd <month>(interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> passado",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.540445040947149),
-                                    ("semana (grain)", -1.540445040947149),
-                                    ("mes (grain)", -1.9459101490553135),
-                                    ("year", -1.9459101490553135),
-                                    ("ano (grain)", -1.9459101490553135),
-                                    ("month", -1.9459101490553135)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = -0.3364722366212129,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("mes (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> para as <hour-of-day> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon", -1.7047480922384253),
-                                    ("hour", -0.7884573603642702),
-                                    ("number (0..15)noon", -1.0116009116784799)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number (20..90)",
-        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}}),
-       ("<dim time> da manha",
-        Classifier{okData =
-                     ClassData{prior = -0.2006706954621511, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> de <named-month>", -2.6026896854443837),
-                                    ("intersect", -2.6026896854443837),
-                                    ("dia <day-of-month> de <named-month>", -2.6026896854443837),
-                                    ("day", -2.1972245773362196),
-                                    ("time-of-day (latent)", -1.9095425048844386),
-                                    ("hour", -1.2163953243244932),
-                                    ("\224s <time-of-day>", -1.9095425048844386)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.7047480922384253, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.8718021769015913),
-                                    ("time-of-day (latent)", -1.8718021769015913),
-                                    ("hour", -1.8718021769015913), ("month", -1.8718021769015913)],
-                               n = 2}}),
-       ("em <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.9444389791664407), ("second", -2.9444389791664407),
-                                    ("day", -2.538973871058276), ("year", -2.538973871058276),
-                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
-                                    ("hour", -2.2512917986064953), ("month", -2.9444389791664407),
-                                    ("minute", -1.845826690498331)],
-                               n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("passados n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)dia (grain)", -1.791759469228055),
-                                    ("integer (numeric)mes (grain)", -1.791759469228055),
-                                    ("integer (numeric)ano (grain)", -1.791759469228055),
-                                    ("day", -1.791759469228055), ("year", -1.791759469228055),
-                                    ("month", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("afternoon",
-        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}}),
-       ("<hour-of-day> and 3/4",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2992829841302609),
-                                    ("hour", -0.7884573603642702),
-                                    ("\224s <time-of-day>", -1.2992829841302609)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.43286408229627876,
-                               unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.0986122886681098),
-                                    ("number (0..15)", -0.46262352194811296)],
-                               n = 24},
-                   koData =
-                     ClassData{prior = -1.0459685551826876, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.8266785731844679),
-                                    ("number (0..15)", -0.8266785731844679),
-                                    ("number (20..90)", -2.0794415416798357)],
-                               n = 13}}),
-       ("<hour-of-day> and <relative minutes>",
-        Classifier{okData =
-                     ClassData{prior = -0.2719337154836418, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224s <time-of-day>number (0..15)", -2.3025850929940455),
-                                    ("time-of-day (latent)number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-                                     -2.5902671654458267),
-                                    ("\224s <time-of-day>number (20..90)", -2.5902671654458267),
-                                    ("\224s <time-of-day>number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-                                     -2.5902671654458267),
-                                    ("time-of-day (latent)number (0..15)", -2.0794415416798357),
-                                    ("hour", -0.8556661100577202),
-                                    ("time-of-day (latent)number (20..90)", -2.5902671654458267),
-                                    ("noonnumber (0..15)", -2.995732273553991)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.4350845252893227,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("\224s <time-of-day>number (20..90)", -1.791759469228055),
-                                    ("time-of-day (latent)number (0..15)", -2.1972245773362196),
-                                    ("hour", -1.0986122886681098),
-                                    ("time-of-day (latent)number (20..90)", -1.791759469228055)],
-                               n = 5}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 6}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.6443570163905132, unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.772588722239781),
-                                    ("number (0..15)ano (grain)", -3.0602707946915624),
-                                    ("integer (numeric)hora (grain)", -3.4657359027997265),
-                                    ("integer (numeric)dia (grain)", -3.4657359027997265),
-                                    ("number (0..15)segundo (grain)", -3.4657359027997265),
-                                    ("second", -3.4657359027997265),
-                                    ("integer (numeric)ano (grain)", -3.4657359027997265),
-                                    ("integer (numeric)minutos (grain)", -2.772588722239781),
-                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)hora (grain)",
-                                     -3.4657359027997265),
-                                    ("day", -3.0602707946915624), ("year", -2.772588722239781),
-                                    ("number (0..15)mes (grain)", -3.0602707946915624),
-                                    ("number (0..15)hora (grain)", -2.772588722239781),
-                                    ("hour", -2.367123614131617), ("month", -3.0602707946915624),
-                                    ("number (0..15)dia (grain)", -3.4657359027997265),
-                                    ("number (0..15)minutos (grain)", -3.0602707946915624),
-                                    ("minute", -2.367123614131617),
-                                    ("number (0..15)semana (grain)", -2.772588722239781)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -0.7444404749474959, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.995732273553991),
-                                    ("number (0..15)ano (grain)", -3.4011973816621555),
-                                    ("integer (numeric)hora (grain)", -2.70805020110221),
-                                    ("integer (numeric)dia (grain)", -2.995732273553991),
-                                    ("integer (numeric)mes (grain)", -3.4011973816621555),
-                                    ("second", -2.995732273553991),
-                                    ("integer (numeric)semana (grain)", -3.4011973816621555),
-                                    ("integer (numeric)ano (grain)", -2.995732273553991),
-                                    ("integer (numeric)minutos (grain)", -2.995732273553991),
-                                    ("day", -2.995732273553991),
-                                    ("integer (numeric)segundo (grain)", -2.995732273553991),
-                                    ("year", -2.70805020110221),
-                                    ("number (0..15)mes (grain)", -2.995732273553991),
-                                    ("number (0..15)hora (grain)", -2.995732273553991),
-                                    ("hour", -2.3025850929940455), ("month", -2.70805020110221),
-                                    ("minute", -2.995732273553991),
-                                    ("number (0..15)semana (grain)", -3.4011973816621555)],
-                               n = 19}}),
-       ("proximas n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("number (0..15)ano (grain)", -2.4849066497880004),
-                                    ("integer (numeric)hora (grain)", -2.4849066497880004),
-                                    ("integer (numeric)dia (grain)", -2.4849066497880004),
-                                    ("second", -2.4849066497880004),
-                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
-                                    ("day", -2.4849066497880004),
-                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
-                                    ("year", -2.4849066497880004),
-                                    ("number (0..15)mes (grain)", -2.4849066497880004),
-                                    ("hour", -2.4849066497880004), ("month", -2.4849066497880004),
-                                    ("minute", -2.4849066497880004)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.252762968495368),
-                                    ("hour", -0.8472978603872037),
-                                    ("\224s <time-of-day>", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1}}),
-       ("n proximas <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("integer (numeric)mes (grain)", -1.791759469228055),
-                                    ("integer (numeric)semana (grain)", -1.791759469228055),
-                                    ("integer (numeric)ano (grain)", -1.791759469228055),
-                                    ("year", -1.791759469228055), ("month", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("vespera de ano novo",
-        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}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.189654742026425,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 64},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("number (20..90)number (0..15)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("day of month (1st)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("ano (grain)",
-        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}}),
-       ("este <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003),
-                                    ("semana (grain)", -1.6094379124341003),
-                                    ("year", -1.6094379124341003),
-                                    ("ano (grain)", -1.6094379124341003)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.0986122886681098),
-                                    ("dia (grain)", -1.0986122886681098)],
-                               n = 3}}),
-       ("<named-month|named-day> next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<part-of-day> dessa semana",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the day after tomorrow",
-        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}}),
-       ("ano novo",
-        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}}),
-       ("dd[/-.]mm[/-.]yyyy",
-        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}}),
-       ("noon",
-        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}}),
-       ("n <cycle> (proximo|que vem)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055),
-                                    ("integer (numeric)semana (grain)", -1.791759469228055),
-                                    ("integer (numeric)ano (grain)", -1.791759469228055),
-                                    ("year", -1.791759469228055),
-                                    ("number (0..15)mes (grain)", -1.791759469228055),
-                                    ("month", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("evening",
-        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}}),
-       ("<hour-of-day> and quinze",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.3862943611198906),
-                                    ("noon", -2.3025850929940455), ("hour", -0.7985076962177716),
-                                    ("\224s <time-of-day>", -1.6094379124341003)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("depois das <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> horas", -1.6739764335716716),
-                                    ("time-of-day (latent)", -1.6739764335716716),
-                                    ("noon", -1.6739764335716716), ("hour", -0.8266785731844679)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.9459101490553135),
-                                    ("dayday", -1.9459101490553135),
-                                    ("hh(:|.|h)mm (time-of-day)hh(:|.|h)mm (time-of-day)",
-                                     -1.9459101490553135),
-                                    ("<day-of-month> de <named-month><day-of-month> de <named-month>",
-                                     -1.9459101490553135)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -2.0794415416798357),
-                                    ("dayyear", -2.0794415416798357),
-                                    ("named-month<day-of-month> de <named-month>",
-                                     -2.0794415416798357),
-                                    ("dd[/-]mmyear", -2.0794415416798357),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -2.0794415416798357),
-                                    ("minuteyear", -2.0794415416798357)],
-                               n = 3}}),
-       ("segundo (grain)",
-        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}}),
-       ("dia (grain)",
-        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}}),
-       ("in the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("afternoon", -1.8718021769015913),
-                                    ("hour", -0.7731898882334817),
-                                    ("morning", -0.9555114450274363)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("natal",
-        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}}),
-       ("morning",
-        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}}),
-       ("week-end",
-        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}}),
-       ("hora (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("right now",
-        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}}),
-       ("quinze para as <hour-of-day> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon", -0.6931471805599453), ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("\224s <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.16507975035944858,
-                               unseen = -4.499809670330265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.7954891891721947),
-                                    ("<hour-of-day> and half", -2.8791984572980396),
-                                    ("<time-of-day> horas", -3.7954891891721947),
-                                    ("<hour-of-day> and 3/4", -3.39002408106403),
-                                    ("time-of-day (latent)", -1.4441139320087168),
-                                    ("<hour-of-day> and <relative minutes>", -2.409194828052304),
-                                    ("<time-of-day> am|pm", -3.7954891891721947),
-                                    ("hour", -1.3105825393841943),
-                                    ("<hour-of-day> and quinze", -3.1023420086122493),
-                                    ("minute", -1.6554230256759237)],
-                               n = 39},
-                   koData =
-                     ClassData{prior = -1.8827312474337816, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("midnight", -2.5257286443082556),
-                                    ("<time-of-day> horas", -2.5257286443082556),
-                                    ("time-of-day (latent)", -1.8325814637483102),
-                                    ("<hour-of-day> and <relative minutes>", -2.120263536200091),
-                                    ("hour", -1.4271163556401458), ("minute", -2.120263536200091)],
-                               n = 7}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (numeric)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2}}),
-       ("fazem <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003), ("year", -2.0149030205422647),
-                                    ("<integer> <unit-of-duration>", -0.916290731874155),
-                                    ("hour", -2.0149030205422647), ("month", -2.0149030205422647)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("n <cycle> atras",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.791759469228055), ("second", -1.791759469228055),
-                                    ("integer (numeric)minutos (grain)", -1.791759469228055),
-                                    ("integer (numeric)segundo (grain)", -1.791759469228055),
-                                    ("minute", -1.791759469228055),
-                                    ("number (0..15)semana (grain)", -1.791759469228055)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("season", -2.1102132003465894),
-                                    ("dia <day-of-month> (non ordinal)", -2.1102132003465894),
-                                    ("day", -1.1939224684724346),
-                                    ("named-day", -2.1102132003465894),
-                                    ("hour", -1.8870696490323797), ("evening", -2.3978952727983707),
-                                    ("week-end", -2.3978952727983707)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/PT_XX.hs b/Duckling/Ranking/Classifiers/PT_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/PT_XX.hs
@@ -0,0 +1,1338 @@
+-- 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.PT_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<cycle> (que vem)",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149),
+                                    ("semana (grain)", -1.540445040947149),
+                                    ("mes (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135),
+                                    ("ano (grain)", -1.9459101490553135),
+                                    ("month", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("semana (grain)", -1.791759469228055),
+                                    ("mes (grain)", -1.791759469228055),
+                                    ("year", -1.791759469228055),
+                                    ("ano (grain)", -1.791759469228055),
+                                    ("month", -1.791759469228055)],
+                               n = 3}}),
+       ("midnight",
+        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}}),
+       ("<dim time> da tarde",
+        Classifier{okData =
+                     ClassData{prior = -0.24686007793152578, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> and half", -2.468099531471619),
+                                    ("time-of-day (latent)", -2.9789251552376097),
+                                    ("<hour-of-day> and <relative minutes>", -2.1316272948504063),
+                                    ("hour", -2.468099531471619),
+                                    ("<hour-of-day> and quinze", -2.468099531471619),
+                                    ("minute", -0.9864949905474035),
+                                    ("\224s <time-of-day>", -1.7749523509116738)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.5198257537444133,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.3437347467010947),
+                                    ("time-of-day (latent)", -2.03688192726104),
+                                    ("year", -1.3437347467010947), ("hour", -2.03688192726104)],
+                               n = 7}}),
+       ("de <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -0.8472978603872037),
+                                    ("\224s <time-of-day>", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6513000706244448, unseen = -4.143134726391533,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 61},
+                   koData =
+                     ClassData{prior = -0.7368222440626069, unseen = -4.060443010546419,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 56}}),
+       ("the day before yesterday",
+        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(:|.|h)mm (time-of-day)",
+        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}}),
+       ("<named-month|named-day> past",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("named-day", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("proximo <cycle> ",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149),
+                                    ("semana (grain)", -1.540445040947149),
+                                    ("mes (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135),
+                                    ("ano (grain)", -1.9459101490553135),
+                                    ("month", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("semana (grain)", -1.791759469228055),
+                                    ("mes (grain)", -1.791759469228055),
+                                    ("year", -1.791759469228055),
+                                    ("ano (grain)", -1.791759469228055),
+                                    ("month", -1.791759469228055)],
+                               n = 3}}),
+       ("dd[/-]mm",
+        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}}),
+       ("intersect by `da` or `de`",
+        Classifier{okData =
+                     ClassData{prior = -1.8325814637483102, unseen = -4.574710978503383,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day of month (1st)named-month", -3.1780538303479458),
+                                    ("daymonth", -2.772588722239781),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
+                                     -3.871201010907891),
+                                    ("<day-of-month> de <named-month>intersect",
+                                     -3.871201010907891),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
+                                     -3.871201010907891),
+                                    ("dayday", -3.1780538303479458),
+                                    ("dia <day-of-month> (non ordinal)named-month",
+                                     -3.4657359027997265),
+                                    ("dayyear", -1.9252908618525775),
+                                    ("named-dayproximo <cycle> ", -3.871201010907891),
+                                    ("dd-dd <month>(interval)year", -3.871201010907891),
+                                    ("named-day<cycle> (que vem)", -3.871201010907891),
+                                    ("two time tokens separated by \",\"2year",
+                                     -3.4657359027997265),
+                                    ("intersectyear", -3.871201010907891),
+                                    ("<day-of-month> de <named-month>year", -2.4849066497880004),
+                                    ("two time tokens separated by \",\"year", -3.4657359027997265),
+                                    ("dayweek", -3.1780538303479458),
+                                    ("named-day<cycle> passado", -3.871201010907891)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -0.1743533871447778, unseen = -5.707110264748875,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)<datetime> - <datetime> (interval)",
+                                     -4.605170185988091),
+                                    ("hourday", -2.870569130599985),
+                                    ("monthday", -4.31748811353631),
+                                    ("monthyear", -3.506557897319982),
+                                    ("yearhour", -3.624340932976365),
+                                    ("houryear", -3.0647251450409425),
+                                    ("time-of-day (latent)two time tokens separated by \",\"2",
+                                     -4.605170185988091),
+                                    ("time-of-day (latent)intersect", -3.0647251450409425),
+                                    ("year (latent)<time-of-day> <part-of-day>",
+                                     -5.0106352940962555),
+                                    ("year (latent)intersect", -4.31748811353631),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"",
+                                     -5.0106352940962555),
+                                    ("year (latent)amanh\227 pela <part-of-day>",
+                                     -5.0106352940962555),
+                                    ("hourmonth", -1.8325814637483102),
+                                    ("time-of-day (latent)intersect by `da` or `de`",
+                                     -3.2188758248682006),
+                                    ("monthmonth", -5.0106352940962555),
+                                    ("dayyear", -5.0106352940962555),
+                                    ("year (latent)named-month", -2.3025850929940455),
+                                    ("named-monthyear", -3.506557897319982),
+                                    ("year (latent)<dim time> da manha", -5.0106352940962555),
+                                    ("de <datetime> - <datetime> (interval)named-month",
+                                     -5.0106352940962555),
+                                    ("\224s <time-of-day>named-month", -4.605170185988091),
+                                    ("yearmonth", -2.3025850929940455),
+                                    ("two time tokens separated by \",\"2year", -4.605170185988091),
+                                    ("intersect by `da` or `de`intersect", -5.0106352940962555),
+                                    ("intersectyear", -5.0106352940962555),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"2",
+                                     -5.0106352940962555),
+                                    ("<day-of-month> de <named-month>year", -5.0106352940962555),
+                                    ("two time tokens separated by \",\"year", -4.605170185988091),
+                                    ("time-of-day (latent)two time tokens separated by \",\"",
+                                     -4.605170185988091),
+                                    ("intersect by `da` or `de`year", -3.506557897319982),
+                                    ("named-monthtwo time tokens separated by \",\"2",
+                                     -5.0106352940962555),
+                                    ("year (latent)<datetime> - <datetime> (interval)",
+                                     -4.605170185988091),
+                                    ("yearday", -5.0106352940962555),
+                                    ("named-monthintersect", -5.0106352940962555),
+                                    ("named-monthtwo time tokens separated by \",\"",
+                                     -5.0106352940962555),
+                                    ("time-of-day (latent)named-month", -2.336486644669727)],
+                               n = 126}}),
+       ("<hour-of-day> and half",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.4816045409242156),
+                                    ("noon", -2.3978952727983707), ("hour", -0.7884573603642702),
+                                    ("\224s <time-of-day>", -1.4816045409242156)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("semana (grain)",
+        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}}),
+       ("two time tokens separated by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -1.0360919316867756, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectnamed-day", -2.8622008809294686),
+                                    ("intersect by `da` or `de`named-day", -2.8622008809294686),
+                                    ("dayday", -1.252762968495368),
+                                    ("de <year>named-day", -2.8622008809294686),
+                                    ("named-dayintersect", -2.456735772821304),
+                                    ("named-dayintersect by `da` or `de`", -2.456735772821304),
+                                    ("yearnamed-day", -2.8622008809294686),
+                                    ("named-day<day-of-month> de <named-month>",
+                                     -2.169053700369523),
+                                    ("yearday", -2.456735772821304)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.4382549309311553,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.3608540011180215),
+                                    ("dayhour", -1.4853852637641216),
+                                    ("daymonth", -2.583997552432231),
+                                    ("monthday", -2.871679624884012),
+                                    ("intersectnamed-day", -2.871679624884012),
+                                    ("intersect by `da` or `de`named-day", -2.3608540011180215),
+                                    ("named-dayintersect", -2.871679624884012),
+                                    ("named-dayintersect by `da` or `de`", -1.405342556090585)],
+                               n = 20}}),
+       ("ordinals (primeiro..10)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("<day-of-month> de <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -7.410797215372185e-2,
+                               unseen = -4.02535169073515,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..15)named-month", -1.927891643552635),
+                                    ("integer (numeric)named-month", -1.0116009116784799),
+                                    ("month", -0.7114963192281418)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -2.639057329615259, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)named-month", -0.8472978603872037),
+                                    ("month", -0.8472978603872037)],
+                               n = 2}}),
+       ("<time-of-day> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.3437715391028245, unseen = -4.61512051684126,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> and quinzeafternoon", -2.995732273553991),
+                                    ("<day-of-month> de <named-month>morning", -3.912023005428146),
+                                    ("dayhour", -3.2188758248682006),
+                                    ("\224s <time-of-day>morning", -3.2188758248682006),
+                                    ("hourhour", -1.8325814637483102),
+                                    ("<hour-of-day> and halfafternoon", -2.995732273553991),
+                                    ("minutehour", -1.5141277326297755),
+                                    ("time-of-day (latent)morning", -3.2188758248682006),
+                                    ("time-of-day (latent)evening", -3.506557897319982),
+                                    ("\224s <time-of-day>afternoon", -2.3025850929940455),
+                                    ("dia <day-of-month> de <named-month>morning",
+                                     -3.912023005428146),
+                                    ("time-of-day (latent)afternoon", -3.506557897319982),
+                                    ("<hour-of-day> and <relative minutes>afternoon",
+                                     -2.659260036932778),
+                                    ("intersectmorning", -3.912023005428146),
+                                    ("\224s <time-of-day>evening", -3.506557897319982),
+                                    ("intersect by `da` or `de`morning", -3.912023005428146)],
+                               n = 39},
+                   koData =
+                     ClassData{prior = -1.2347444629926898, unseen = -4.007333185232471,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -1.5040773967762742),
+                                    ("monthhour", -2.890371757896165),
+                                    ("hourhour", -2.6026896854443837),
+                                    ("time-of-day (latent)morning", -3.295836866004329),
+                                    ("year (latent)afternoon", -2.1972245773362196),
+                                    ("named-monthmorning", -3.295836866004329),
+                                    ("year (latent)evening", -2.890371757896165),
+                                    ("time-of-day (latent)afternoon", -2.890371757896165),
+                                    ("year (latent)morning", -2.379546134130174),
+                                    ("intersect by `da` or `de`morning", -3.295836866004329)],
+                               n = 16}}),
+       ("de <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthday", -2.1972245773362196),
+                                    ("monthyear", -2.1972245773362196),
+                                    ("monthhour", -1.791759469228055),
+                                    ("monthmonth", -2.1972245773362196),
+                                    ("named-monthyear (latent)", -2.1972245773362196),
+                                    ("named-monthtime-of-day (latent)", -2.1972245773362196),
+                                    ("named-month<day-of-month> de <named-month>",
+                                     -2.1972245773362196),
+                                    ("named-monthintersect by `da` or `de`", -1.791759469228055)],
+                               n = 5}}),
+       ("<time-of-day> horas",
+        Classifier{okData =
+                     ClassData{prior = -0.7731898882334817,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.5040773967762742),
+                                    ("hour", -0.9444616088408514),
+                                    ("depois das <time-of-day>", -1.791759469228055),
+                                    ("\224s <time-of-day>", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.6190392084062235, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.2039728043259361),
+                                    ("<hour-of-day> and <relative minutes>", -2.3025850929940455),
+                                    ("hour", -1.0498221244986778), ("minute", -2.3025850929940455),
+                                    ("\224s <time-of-day>", -2.3025850929940455)],
+                               n = 7}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.702716631576096, unseen = -5.1298987149230735,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> de <named-month>in the <part-of-day>",
+                                     -4.02535169073515),
+                                    ("dayhour", -2.3513752571634776),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"2",
+                                     -4.430816798843313),
+                                    ("nowquinze para as <hour-of-day> (as relative minutes)",
+                                     -4.430816798843313),
+                                    ("intersectnamed-day", -4.430816798843313),
+                                    ("now\224s <time-of-day>", -4.02535169073515),
+                                    ("<day-of-month> de <named-month>intersect",
+                                     -4.430816798843313),
+                                    ("now<hour-of-day> and 3/4", -4.430816798843313),
+                                    ("intersect by `da` or `de`named-day", -4.430816798843313),
+                                    ("<day-of-month> de <named-month>two time tokens separated by \",\"",
+                                     -4.430816798843313),
+                                    ("dayday", -2.9267394020670396),
+                                    ("hourhour", -4.430816798843313),
+                                    ("named-day\224s <time-of-day>", -4.430816798843313),
+                                    ("dayyear", -2.4159137783010487),
+                                    ("minutehour", -3.1780538303479458),
+                                    ("<hour-of-day> and quinzein the <part-of-day>",
+                                     -4.02535169073515),
+                                    ("de <year>named-day", -4.430816798843313),
+                                    ("intersect by `da` or `de`in the <part-of-day>",
+                                     -4.02535169073515),
+                                    ("now<hour-of-day> and <relative minutes>", -4.430816798843313),
+                                    ("named-dayin the <part-of-day>", -4.430816798843313),
+                                    ("tomorrow<time-of-day> horas", -4.02535169073515),
+                                    ("now<integer> para as <hour-of-day> (as relative minutes)",
+                                     -4.430816798843313),
+                                    ("\224s <time-of-day>in the <part-of-day>",
+                                     -3.7376696182833684),
+                                    ("named-dayintersect", -4.430816798843313),
+                                    ("named-dayamanh\227 pela <part-of-day>", -4.430816798843313),
+                                    ("dayminute", -3.1780538303479458),
+                                    ("named-dayintersect by `da` or `de`", -4.430816798843313),
+                                    ("yearnamed-day", -4.430816798843313),
+                                    ("dd-dd <month>(interval)de <year>", -4.430816798843313),
+                                    ("named-day<day-of-month> de <named-month>",
+                                     -4.430816798843313),
+                                    ("named-day<time-of-day> <part-of-day>", -4.430816798843313),
+                                    ("dia <day-of-month> de <named-month>in the <part-of-day>",
+                                     -4.02535169073515),
+                                    ("yearday", -4.02535169073515),
+                                    ("named-day<dim time> da manha", -4.430816798843313),
+                                    ("two time tokens separated by \",\"de <year>",
+                                     -4.02535169073515),
+                                    ("dd[/-]mmyear", -4.430816798843313),
+                                    ("<day-of-month> de <named-month>de <year>",
+                                     -3.044522437723423),
+                                    ("tomorrowdepois das <time-of-day>", -4.02535169073515),
+                                    ("<hour-of-day> and <relative minutes>in the <part-of-day>",
+                                     -4.02535169073515),
+                                    ("two time tokens separated by \",\"2de <year>",
+                                     -4.02535169073515),
+                                    ("intersectde <year>", -4.430816798843313)],
+                               n = 52},
+                   koData =
+                     ClassData{prior = -0.6836684366054016, unseen = -5.14166355650266,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.9385738597140425),
+                                    ("dayhour", -3.056356895370426),
+                                    ("daymonth", -4.442651256490317),
+                                    ("monthday", -3.3440389678222067),
+                                    ("named-month\224s <time-of-day>", -4.442651256490317),
+                                    ("monthyear", -2.9385738597140425),
+                                    ("intersectnamed-day", -4.037186148382152),
+                                    ("now\224s <time-of-day>", -4.037186148382152),
+                                    ("houryear", -2.496741107435003),
+                                    ("<time-of-day> am|pm<day-of-month> de <named-month>",
+                                     -4.442651256490317),
+                                    ("intersect by `da` or `de`named-day", -3.5263605246161616),
+                                    ("monthhour", -3.1898882879949486),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"",
+                                     -4.442651256490317),
+                                    ("hourmonth", -4.442651256490317),
+                                    ("<time-of-day> am|pmintersect by `da` or `de`",
+                                     -4.442651256490317),
+                                    ("dayyear", -4.442651256490317),
+                                    ("intersect by `da` or `de`\224s <time-of-day>",
+                                     -4.442651256490317),
+                                    ("intersect by `da` or `de`in the <part-of-day>",
+                                     -4.037186148382152),
+                                    ("now<hour-of-day> and <relative minutes>", -4.442651256490317),
+                                    ("daysecond", -4.442651256490317),
+                                    ("named-dayright now", -4.442651256490317),
+                                    ("named-dayintersect", -4.442651256490317),
+                                    ("dayminute", -4.037186148382152),
+                                    ("named-monthde <year>", -2.9385738597140425),
+                                    ("intersect by `da` or `de`intersect", -4.442651256490317),
+                                    ("intersect by `da` or `de`two time tokens separated by \",\"2",
+                                     -4.442651256490317),
+                                    ("named-dayintersect by `da` or `de`", -3.3440389678222067),
+                                    ("named-monthin the <part-of-day>", -4.037186148382152),
+                                    ("named-monthtwo time tokens separated by \",\"2",
+                                     -4.442651256490317),
+                                    ("two time tokens separated by \",\"de <year>",
+                                     -4.037186148382152),
+                                    ("intersect by `da` or `de`de <year>", -2.9385738597140425),
+                                    ("named-monthintersect", -4.442651256490317),
+                                    ("<day-of-month> de <named-month>\224s <time-of-day>",
+                                     -4.442651256490317),
+                                    ("<day-of-month> de <named-month>de <year>",
+                                     -4.442651256490317),
+                                    ("two time tokens separated by \",\"2de <year>",
+                                     -4.037186148382152),
+                                    ("intersectde <year>", -4.442651256490317),
+                                    ("named-monthtwo time tokens separated by \",\"",
+                                     -4.442651256490317)],
+                               n = 53}}),
+       ("season",
+        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}}),
+       ("minutos (grain)",
+        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}}),
+       ("two time tokens separated by \",\"2",
+        Classifier{okData =
+                     ClassData{prior = -1.0360919316867756, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersectnamed-day", -2.8622008809294686),
+                                    ("intersect by `da` or `de`named-day", -2.8622008809294686),
+                                    ("dayday", -1.252762968495368),
+                                    ("de <year>named-day", -2.8622008809294686),
+                                    ("named-dayintersect", -2.456735772821304),
+                                    ("named-dayintersect by `da` or `de`", -2.456735772821304),
+                                    ("yearnamed-day", -2.8622008809294686),
+                                    ("named-day<day-of-month> de <named-month>",
+                                     -2.169053700369523),
+                                    ("yearday", -2.456735772821304)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.4382549309311553,
+                               unseen = -3.9889840465642745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.3608540011180215),
+                                    ("dayhour", -1.4853852637641216),
+                                    ("daymonth", -2.583997552432231),
+                                    ("monthday", -2.871679624884012),
+                                    ("intersectnamed-day", -2.871679624884012),
+                                    ("intersect by `da` or `de`named-day", -2.3608540011180215),
+                                    ("named-dayintersect", -2.871679624884012),
+                                    ("named-dayintersect by `da` or `de`", -1.405342556090585)],
+                               n = 20}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.6061358035703156),
+                                    ("number (0..15)", -1.0116009116784799),
+                                    ("numbers prefix with -, negative or minus",
+                                     -3.0910424533583156),
+                                    ("number (20..90)", -3.0910424533583156)],
+                               n = 40}}),
+       ("n[ao] <date>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dia <day-of-month> (non ordinal)", -1.252762968495368),
+                                    ("day", -0.8472978603872037),
+                                    ("named-day", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("amanh\227 pela <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.3294792011302423, unseen = -4.672828834461907,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<hour-of-day> and quinzeafternoon", -3.054001181677967),
+                                    ("<day-of-month> de <named-month>morning", -3.970291913552122),
+                                    ("dayhour", -2.871679624884012),
+                                    ("\224s <time-of-day>morning", -3.2771447329921766),
+                                    ("hourhour", -1.890850371872286),
+                                    ("<hour-of-day> and halfafternoon", -3.054001181677967),
+                                    ("minutehour", -1.5723966407537513),
+                                    ("tomorrowevening", -3.970291913552122),
+                                    ("time-of-day (latent)morning", -3.2771447329921766),
+                                    ("time-of-day (latent)evening", -3.5648268054439574),
+                                    ("\224s <time-of-day>afternoon", -2.3608540011180215),
+                                    ("dia <day-of-month> de <named-month>morning",
+                                     -3.970291913552122),
+                                    ("yesterdayevening", -3.970291913552122),
+                                    ("time-of-day (latent)afternoon", -3.5648268054439574),
+                                    ("<hour-of-day> and <relative minutes>afternoon",
+                                     -2.717528945056754),
+                                    ("intersectmorning", -3.970291913552122),
+                                    ("\224s <time-of-day>evening", -3.5648268054439574),
+                                    ("intersect by `da` or `de`morning", -3.970291913552122)],
+                               n = 41},
+                   koData =
+                     ClassData{prior = -1.270462545594769, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -1.540445040947149),
+                                    ("monthhour", -2.9267394020670396),
+                                    ("hourhour", -2.639057329615259),
+                                    ("time-of-day (latent)morning", -3.332204510175204),
+                                    ("year (latent)afternoon", -2.2335922215070942),
+                                    ("named-monthmorning", -3.332204510175204),
+                                    ("year (latent)evening", -2.9267394020670396),
+                                    ("time-of-day (latent)afternoon", -2.9267394020670396),
+                                    ("year (latent)morning", -2.4159137783010487),
+                                    ("intersect by `da` or `de`morning", -3.332204510175204)],
+                               n = 16}}),
+       ("dentro de <duration>",
+        Classifier{okData =
+                     ClassData{prior = -2.772588722239781, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration>", -1.6094379124341003),
+                                    ("hour", -1.6094379124341003)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9444389791664407), ("second", -2.9444389791664407),
+                                    ("day", -2.538973871058276), ("year", -2.538973871058276),
+                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
+                                    ("hour", -2.2512917986064953), ("month", -2.9444389791664407),
+                                    ("minute", -1.845826690498331)],
+                               n = 15}}),
+       ("dia <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("named-month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("dia <day-of-month> de <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)named-month", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("evening", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number (0..15)",
+        Classifier{okData =
+                     ClassData{prior = -1.9048194970694474e-2,
+                               unseen = -3.9889840465642745,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 52},
+                   koData =
+                     ClassData{prior = -3.970291913552122, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("antes das <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight", -1.2992829841302609),
+                                    ("noon", -1.2992829841302609), ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("dd-dd <month>(interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("named-month", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> passado",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.540445040947149),
+                                    ("semana (grain)", -1.540445040947149),
+                                    ("mes (grain)", -1.9459101490553135),
+                                    ("year", -1.9459101490553135),
+                                    ("ano (grain)", -1.9459101490553135),
+                                    ("month", -1.9459101490553135)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("mes (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> para as <hour-of-day> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon", -1.7047480922384253),
+                                    ("hour", -0.7884573603642702),
+                                    ("number (0..15)noon", -1.0116009116784799)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number (20..90)",
+        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}}),
+       ("<dim time> da manha",
+        Classifier{okData =
+                     ClassData{prior = -0.262364264467491, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect by `da` or `de`", -2.70805020110221),
+                                    ("<day-of-month> de <named-month>", -2.70805020110221),
+                                    ("intersect", -2.70805020110221),
+                                    ("dia <day-of-month> de <named-month>", -2.70805020110221),
+                                    ("day", -2.0149030205422647),
+                                    ("time-of-day (latent)", -2.0149030205422647),
+                                    ("hour", -1.3217558399823195),
+                                    ("\224s <time-of-day>", -2.0149030205422647)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -1.466337068793427, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect by `da` or `de`", -2.0794415416798357),
+                                    ("named-month", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357), ("month", -1.6739764335716716)],
+                               n = 3}}),
+       ("em <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9444389791664407), ("second", -2.9444389791664407),
+                                    ("day", -2.538973871058276), ("year", -2.538973871058276),
+                                    ("<integer> <unit-of-duration>", -0.8649974374866046),
+                                    ("hour", -2.2512917986064953), ("month", -2.9444389791664407),
+                                    ("minute", -1.845826690498331)],
+                               n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("passados n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)dia (grain)", -1.791759469228055),
+                                    ("integer (numeric)mes (grain)", -1.791759469228055),
+                                    ("integer (numeric)ano (grain)", -1.791759469228055),
+                                    ("day", -1.791759469228055), ("year", -1.791759469228055),
+                                    ("month", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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}}),
+       ("<hour-of-day> and 3/4",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.2992829841302609),
+                                    ("hour", -0.7884573603642702),
+                                    ("\224s <time-of-day>", -1.2992829841302609)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.9328200338253656, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0986122886681098),
+                                    ("number (0..15)", -0.46262352194811296)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -0.4999559515290868, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.5108256237659907),
+                                    ("number (0..15)", -1.0498221244986778),
+                                    ("number (20..90)", -2.995732273553991)],
+                               n = 37}}),
+       ("<hour-of-day> and <relative minutes>",
+        Classifier{okData =
+                     ClassData{prior = -0.2719337154836418, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224s <time-of-day>number (0..15)", -2.3025850929940455),
+                                    ("time-of-day (latent)number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+                                     -2.5902671654458267),
+                                    ("\224s <time-of-day>number (20..90)", -2.5902671654458267),
+                                    ("\224s <time-of-day>number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+                                     -2.5902671654458267),
+                                    ("time-of-day (latent)number (0..15)", -2.0794415416798357),
+                                    ("hour", -0.8556661100577202),
+                                    ("time-of-day (latent)number (20..90)", -2.5902671654458267),
+                                    ("noonnumber (0..15)", -2.995732273553991)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -1.4350845252893227,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("\224s <time-of-day>number (20..90)", -1.791759469228055),
+                                    ("time-of-day (latent)number (0..15)", -2.1972245773362196),
+                                    ("hour", -1.0986122886681098),
+                                    ("time-of-day (latent)number (20..90)", -1.791759469228055)],
+                               n = 5}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 6}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.6443570163905132, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.772588722239781),
+                                    ("number (0..15)ano (grain)", -3.0602707946915624),
+                                    ("integer (numeric)hora (grain)", -3.4657359027997265),
+                                    ("integer (numeric)dia (grain)", -3.4657359027997265),
+                                    ("number (0..15)segundo (grain)", -3.4657359027997265),
+                                    ("second", -3.4657359027997265),
+                                    ("integer (numeric)ano (grain)", -3.4657359027997265),
+                                    ("integer (numeric)minutos (grain)", -2.772588722239781),
+                                    ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)hora (grain)",
+                                     -3.4657359027997265),
+                                    ("day", -3.0602707946915624), ("year", -2.772588722239781),
+                                    ("number (0..15)mes (grain)", -3.0602707946915624),
+                                    ("number (0..15)hora (grain)", -2.772588722239781),
+                                    ("hour", -2.367123614131617), ("month", -3.0602707946915624),
+                                    ("number (0..15)dia (grain)", -3.4657359027997265),
+                                    ("number (0..15)minutos (grain)", -3.0602707946915624),
+                                    ("minute", -2.367123614131617),
+                                    ("number (0..15)semana (grain)", -2.772588722239781)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -0.7444404749474959, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.995732273553991),
+                                    ("number (0..15)ano (grain)", -3.4011973816621555),
+                                    ("integer (numeric)hora (grain)", -2.70805020110221),
+                                    ("integer (numeric)dia (grain)", -2.995732273553991),
+                                    ("integer (numeric)mes (grain)", -3.4011973816621555),
+                                    ("second", -2.995732273553991),
+                                    ("integer (numeric)semana (grain)", -3.4011973816621555),
+                                    ("integer (numeric)ano (grain)", -2.995732273553991),
+                                    ("integer (numeric)minutos (grain)", -2.995732273553991),
+                                    ("day", -2.995732273553991),
+                                    ("integer (numeric)segundo (grain)", -2.995732273553991),
+                                    ("year", -2.70805020110221),
+                                    ("number (0..15)mes (grain)", -2.995732273553991),
+                                    ("number (0..15)hora (grain)", -2.995732273553991),
+                                    ("hour", -2.3025850929940455), ("month", -2.70805020110221),
+                                    ("minute", -2.995732273553991),
+                                    ("number (0..15)semana (grain)", -3.4011973816621555)],
+                               n = 19}}),
+       ("proximas n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number (0..15)ano (grain)", -2.4849066497880004),
+                                    ("integer (numeric)hora (grain)", -2.4849066497880004),
+                                    ("integer (numeric)dia (grain)", -2.4849066497880004),
+                                    ("second", -2.4849066497880004),
+                                    ("integer (numeric)minutos (grain)", -2.4849066497880004),
+                                    ("day", -2.4849066497880004),
+                                    ("integer (numeric)segundo (grain)", -2.4849066497880004),
+                                    ("year", -2.4849066497880004),
+                                    ("number (0..15)mes (grain)", -2.4849066497880004),
+                                    ("hour", -2.4849066497880004), ("month", -2.4849066497880004),
+                                    ("minute", -2.4849066497880004)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.252762968495368),
+                                    ("hour", -0.8472978603872037),
+                                    ("\224s <time-of-day>", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1}}),
+       ("n proximas <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("integer (numeric)mes (grain)", -1.791759469228055),
+                                    ("integer (numeric)semana (grain)", -1.791759469228055),
+                                    ("integer (numeric)ano (grain)", -1.791759469228055),
+                                    ("year", -1.791759469228055), ("month", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("vespera de ano novo",
+        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}}),
+       ("named-day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.174387269895637,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 63},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("number (20..90)number (0..15)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day of month (1st)",
+        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}}),
+       ("ano (grain)",
+        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}}),
+       ("este <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("semana (grain)", -1.6094379124341003),
+                                    ("year", -1.6094379124341003),
+                                    ("ano (grain)", -1.6094379124341003)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.0986122886681098),
+                                    ("dia (grain)", -1.0986122886681098)],
+                               n = 3}}),
+       ("<named-month|named-day> next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("named-day", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<part-of-day> dessa semana",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("named-day", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the day after tomorrow",
+        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}}),
+       ("ano novo",
+        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}}),
+       ("dd[/-.]mm[/-.]yyyy",
+        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}}),
+       ("noon",
+        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}}),
+       ("n <cycle> (proximo|que vem)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("integer (numeric)semana (grain)", -1.791759469228055),
+                                    ("integer (numeric)ano (grain)", -1.791759469228055),
+                                    ("year", -1.791759469228055),
+                                    ("number (0..15)mes (grain)", -1.791759469228055),
+                                    ("month", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("evening",
+        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}}),
+       ("<hour-of-day> and quinze",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.3862943611198906),
+                                    ("noon", -2.3025850929940455), ("hour", -0.7985076962177716),
+                                    ("\224s <time-of-day>", -1.6094379124341003)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("depois das <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> horas", -1.6739764335716716),
+                                    ("time-of-day (latent)", -1.6739764335716716),
+                                    ("noon", -1.6739764335716716), ("hour", -0.8266785731844679)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.791759469228055, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.3978952727983707),
+                                    ("dayday", -2.3978952727983707),
+                                    ("hh(:|.|h)mm (time-of-day)hh(:|.|h)mm (time-of-day)",
+                                     -2.3978952727983707),
+                                    ("<day-of-month> de <named-month><day-of-month> de <named-month>",
+                                     -2.3978952727983707)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -2.9444389791664407),
+                                    ("dayhour", -2.9444389791664407),
+                                    ("daymonth", -2.9444389791664407),
+                                    ("monthday", -2.538973871058276),
+                                    ("<day-of-month> de <named-month>intersect by `da` or `de`",
+                                     -2.538973871058276),
+                                    ("monthhour", -2.538973871058276),
+                                    ("monthmonth", -2.9444389791664407),
+                                    ("hourhour", -2.9444389791664407),
+                                    ("dayyear", -2.9444389791664407),
+                                    ("named-month<day-of-month> de <named-month>",
+                                     -2.9444389791664407),
+                                    ("intersect by `da` or `de`<day-of-month> de <named-month>",
+                                     -2.538973871058276),
+                                    ("intersect by `da` or `de`intersect by `da` or `de`",
+                                     -2.538973871058276),
+                                    ("dd[/-]mmyear", -2.9444389791664407),
+                                    ("named-monthintersect by `da` or `de`", -2.538973871058276)],
+                               n = 10}}),
+       ("segundo (grain)",
+        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}}),
+       ("dia (grain)",
+        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}}),
+       ("in the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("afternoon", -1.8718021769015913),
+                                    ("hour", -0.7731898882334817),
+                                    ("morning", -0.9555114450274363)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("named-day", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("natal",
+        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}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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}}),
+       ("hora (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("right now",
+        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}}),
+       ("quinze para as <hour-of-day> (as relative minutes)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon", -0.6931471805599453), ("hour", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("\224s <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.16507975035944858,
+                               unseen = -4.499809670330265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.7954891891721947),
+                                    ("<hour-of-day> and half", -2.8791984572980396),
+                                    ("<time-of-day> horas", -3.7954891891721947),
+                                    ("<hour-of-day> and 3/4", -3.39002408106403),
+                                    ("time-of-day (latent)", -1.4441139320087168),
+                                    ("<hour-of-day> and <relative minutes>", -2.409194828052304),
+                                    ("<time-of-day> am|pm", -3.7954891891721947),
+                                    ("hour", -1.3105825393841943),
+                                    ("<hour-of-day> and quinze", -3.1023420086122493),
+                                    ("minute", -1.6554230256759237)],
+                               n = 39},
+                   koData =
+                     ClassData{prior = -1.8827312474337816, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("midnight", -2.5257286443082556),
+                                    ("<time-of-day> horas", -2.5257286443082556),
+                                    ("time-of-day (latent)", -1.8325814637483102),
+                                    ("<hour-of-day> and <relative minutes>", -2.120263536200091),
+                                    ("hour", -1.4271163556401458), ("minute", -2.120263536200091)],
+                               n = 7}}),
+       ("fazem <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003), ("year", -2.0149030205422647),
+                                    ("<integer> <unit-of-duration>", -0.916290731874155),
+                                    ("hour", -2.0149030205422647), ("month", -2.0149030205422647)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> atras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055), ("second", -1.791759469228055),
+                                    ("integer (numeric)minutos (grain)", -1.791759469228055),
+                                    ("integer (numeric)segundo (grain)", -1.791759469228055),
+                                    ("minute", -1.791759469228055),
+                                    ("number (0..15)semana (grain)", -1.791759469228055)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("season", -2.1102132003465894),
+                                    ("dia <day-of-month> (non ordinal)", -2.1102132003465894),
+                                    ("day", -1.1939224684724346),
+                                    ("named-day", -2.1102132003465894),
+                                    ("hour", -1.8870696490323797), ("evening", -2.3978952727983707),
+                                    ("week-end", -2.3978952727983707)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/RO.hs b/Duckling/Ranking/Classifiers/RO.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/RO.hs
+++ /dev/null
@@ -1,265 +0,0 @@
--- 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.RO (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("integer (numeric)",
-        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}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("acum",
-        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.13353139262452263,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.9924301646902063),
-                                    ("dayday", -1.2992829841302609),
-                                    ("<named-day> <day-of-month> (number)named-month",
-                                     -1.9924301646902063),
-                                    ("absorption of , after named day<day-of-month>(number) <named-month>",
-                                     -1.9924301646902063),
-                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -1.9924301646902063),
-                                    ("named-daythe <day-of-month> (number)", -2.3978952727983707)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month<hour-of-day> <integer> (as relative minutes)",
-                                     -1.6094379124341003),
-                                    ("monthminute", -1.6094379124341003)],
-                               n = 1}}),
-       ("<named-day> <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayinteger (numeric)", -1.2992829841302609),
-                                    ("day", -0.7884573603642702),
-                                    ("absorption of , after named dayinteger (numeric)",
-                                     -1.2992829841302609)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-month",
-        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}}),
-       ("numbers prefix with - or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("craciun",
-        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 <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}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1}}),
-       ("ieri",
-        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 \",\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.7884573603642702),
-                                    ("named-day<day-of-month>(number) <named-month>",
-                                     -1.2992829841302609),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -1.2992829841302609)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("azi",
-        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}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 22},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-day> pe <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-dayinteger (numeric)", -0.6931471805599453),
-                                    ("day", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (0..10)",
-        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> (aceasta|acesta|[a\259]sta)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -1.0116009116784799),
-                                    ("integer (0..10)named-month", -1.7047480922384253),
-                                    ("month", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("maine",
-        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}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (numeric)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1}}),
-       ("<day-of-month>(number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -1.0116009116784799),
-                                    ("integer (0..10)named-month", -1.7047480922384253),
-                                    ("month", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/RO_XX.hs b/Duckling/Ranking/Classifiers/RO_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/RO_XX.hs
@@ -0,0 +1,286 @@
+-- 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.RO_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("integer (numeric)",
+        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}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("luni", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("acum",
+        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.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.8971199848858813),
+                                    ("martithe <day-of-month> (number)", -2.3025850929940455),
+                                    ("dayday", -1.2039728043259361),
+                                    ("absorption of , after named day<day-of-month>(number) <named-month>",
+                                     -1.8971199848858813),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -1.8971199848858813),
+                                    ("<named-day> <day-of-month> (number)februarie",
+                                     -1.8971199848858813)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-day> <day-of-month> (number)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.7884573603642702),
+                                    ("martiinteger (numeric)", -1.2992829841302609),
+                                    ("absorption of , after named dayinteger (numeric)",
+                                     -1.2992829841302609)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("duminica",
+        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}}),
+       ("marti",
+        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}}),
+       ("iunie",
+        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}}),
+       ("numbers prefix with - or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1}}),
+       ("luni",
+        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}}),
+       ("februarie",
+        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}}),
+       ("craciun",
+        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}}),
+       ("sambata",
+        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}}),
+       ("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}}),
+       ("joi",
+        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}}),
+       ("vineri",
+        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}}),
+       ("ieri",
+        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 \",\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("luni<day-of-month>(number) <named-month>",
+                                     -1.2992829841302609),
+                                    ("dayday", -0.7884573603642702),
+                                    ("luni<day-of-month> (non ordinal) <named-month>",
+                                     -1.2992829841302609)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("azi",
+        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}}),
+       ("<named-day> pe <day-of-month> (number)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("martiinteger (numeric)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (0..10)",
+        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> (aceasta|acesta|[a\259]sta)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("luni", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("iunieinteger (numeric)", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)martie", -1.791759469228055),
+                                    ("integer (numeric)februarie", -1.3862943611198906),
+                                    ("integer (0..10)martie", -1.791759469228055),
+                                    ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("luni", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("martie",
+        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}}),
+       ("maine",
+        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}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("iunie", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)martie", -1.791759469228055),
+                                    ("integer (numeric)februarie", -1.3862943611198906),
+                                    ("integer (0..10)martie", -1.791759469228055),
+                                    ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/RU.hs b/Duckling/Ranking/Classifiers/RU.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/RU.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.RU (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/RU_XX.hs b/Duckling/Ranking/Classifiers/RU_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/RU_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.RU_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/SV.hs b/Duckling/Ranking/Classifiers/SV.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/SV.hs
+++ /dev/null
@@ -1,1596 +0,0 @@
--- 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.SV (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.2039728043259361),
-                                    ("hh:mm", -1.6094379124341003), ("hour", -1.6094379124341003),
-                                    ("minute", -1.2039728043259361)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.7672551527136672, unseen = -4.882801922586371,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 130},
-                   koData =
-                     ClassData{prior = -0.6241543090729939,
-                               unseen = -5.0238805208462765,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 150}}),
-       ("the day before yesterday",
-        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}}),
-       ("lunch",
-        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 (20..90)",
-        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> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.9555114450274363),
-                                    ("tomorrowevening", -1.8718021769015913),
-                                    ("named-daymorning", -1.8718021769015913),
-                                    ("tomorrowlunch", -1.8718021769015913),
-                                    ("yesterdayevening", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("couple, a pair",
-        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/mm",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("today",
-        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}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2607262624632527, unseen = -4.624972813284271,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.5165082281731497),
-                                    ("time-of-day (latent)", -1.2139231351791042),
-                                    ("relative minutes after|past <integer> (hour-of-day)",
-                                     -3.5165082281731497),
-                                    ("hh:mm", -2.0501711593797225),
-                                    ("<time-of-day> sharp", -3.5165082281731497),
-                                    ("hour", -1.149384614041533), ("minute", -1.7819071727850433)],
-                               n = 47},
-                   koData =
-                     ClassData{prior = -1.4718165345580525, unseen = -3.58351893845611,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.8472978603872037),
-                                    ("hour", -0.8472978603872037)],
-                               n = 14}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        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}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -4.430816798843313,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -3.3202283191284883),
-                                    ("the <day-of-month> (non ordinal)", -3.3202283191284883),
-                                    ("<day-of-month>(ordinal) <named-month>", -2.339399066116762),
-                                    ("day", -0.8634925463071842),
-                                    ("the <day-of-month> (ordinal)", -3.3202283191284883),
-                                    ("afternoon", -3.7256934272366524),
-                                    ("named-day", -2.1162555148025524),
-                                    ("<day-of-month> (ordinal)", -1.9339339580085977),
-                                    ("hour", -3.7256934272366524),
-                                    ("<day-of-month> (non ordinal) <named-month>",
-                                     -3.7256934272366524)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.3608540011180215),
-                                    ("year (latent)", -1.7730673362159024),
-                                    ("time-of-day (latent)", -1.7730673362159024),
-                                    ("year", -1.5723966407537513), ("hour", -1.5723966407537513)],
-                               n = 20}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.2803019651541584, unseen = -3.58351893845611,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 34},
-                   koData =
-                     ClassData{prior = -1.4087672169719492,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.9808292530117262),
-                                    ("hh:mmhh:mm", -0.9808292530117262)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 2}}),
-       ("between <datetime> and <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.252762968495368, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.2992829841302609),
-                                    ("hh:mmhh:mm", -1.2992829841302609)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.3364722366212129, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mm<day-of-month> (ordinal)", -1.7346010553881064),
-                                    ("hh:mmtime-of-day (latent)", -1.7346010553881064),
-                                    ("minuteminute", -2.1400661634962708),
-                                    ("minutehour", -1.7346010553881064),
-                                    ("hh:mmintersect", -2.1400661634962708),
-                                    ("minuteday", -1.7346010553881064)],
-                               n = 5}}),
-       ("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 = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -1.252762968495368),
-                                    ("integer (0..19)minute (grain)", -1.252762968495368),
-                                    ("minute", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        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}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.11778303565638351,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -2.1972245773362196,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.0986122886681098),
-                                    ("quarter", -0.8109302162163288),
-                                    ("ordinals (first..31st)quarter (grain)", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
-                                    ("quarter", -0.8472978603872037),
-                                    ("ordinals (first..31st)quarter (grain)", -1.252762968495368)],
-                               n = 2}}),
-       ("Last year",
-        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.4382549309311553, unseen = -6.003887067106539,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.209655408733095),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.209655408733095),
-                                    ("hourday", -5.308267697401205),
-                                    ("dayhour", -3.0569758987947098),
-                                    ("daymonth", -2.956892440237727),
-                                    ("monthyear", -3.29336467685894),
-                                    ("intersecthh:mm", -4.9028025892930405),
-                                    ("named-daylast <cycle>", -5.308267697401205),
-                                    ("the <day-of-month> (ordinal)named-month",
-                                     -3.9219733362813143),
-                                    ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -4.9028025892930405),
-                                    ("last <day-of-week> of <time>year", -5.308267697401205),
-                                    ("todayat <time-of-day>", -4.9028025892930405),
-                                    ("dayday", -2.6341190479746763),
-                                    ("dd/mmat <time-of-day>", -4.39197696552705),
-                                    ("intersect by \",\"hh:mm", -3.804190300624931),
-                                    ("named-day<named-month> <day-of-month> (ordinal)",
-                                     -5.308267697401205),
-                                    ("intersectnamed-month", -4.9028025892930405),
-                                    ("dayyear", -3.362357548345891),
-                                    ("named-daythis <time>", -4.209655408733095),
-                                    ("tomorrow<time-of-day> sharp", -4.9028025892930405),
-                                    ("<day-of-month>(ordinal) <named-month>year",
-                                     -4.39197696552705),
-                                    ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -4.61512051684126),
-                                    ("absorption of , after named day<named-month> <day-of-month> (ordinal)",
-                                     -4.209655408733095),
-                                    ("named-day<time> timezone", -4.61512051684126),
-                                    ("named-monthyear", -3.29336467685894),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -4.209655408733095),
-                                    ("on <date>named-month", -3.9219733362813143),
-                                    ("tomorrowuntil <time-of-day>", -4.9028025892930405),
-                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.61512051684126),
-                                    ("after <time-of-day>at <time-of-day>", -4.9028025892930405),
-                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -4.9028025892930405),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -5.308267697401205),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -5.308267697401205),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -4.9028025892930405),
-                                    ("named-daynext <cycle>", -5.308267697401205),
-                                    ("named-dayintersect", -4.9028025892930405),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.9028025892930405),
-                                    ("tomorrowafter <time-of-day>", -4.9028025892930405),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.39197696552705),
-                                    ("dayminute", -2.6692103677859462),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -4.61512051684126),
-                                    ("<ordinal> <cycle> of <time>year", -4.9028025892930405),
-                                    ("minuteday", -2.6341190479746763),
-                                    ("absorption of , after named dayintersect",
-                                     -4.9028025892930405),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.308267697401205),
-                                    ("named-dayon <date>", -4.61512051684126),
-                                    ("named-dayat <time-of-day>", -4.9028025892930405),
-                                    ("yearhh:mm", -5.308267697401205),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -5.308267697401205),
-                                    ("absorption of , after named dayintersect by \",\"",
-                                     -4.39197696552705),
-                                    ("dd/mmyear", -4.9028025892930405),
-                                    ("at <time-of-day>on <date>", -5.308267697401205),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -5.308267697401205),
-                                    ("between <datetime> and <datetime> (interval)on <date>",
-                                     -5.308267697401205),
-                                    ("dayweek", -4.055504728905837),
-                                    ("intersect by \",\"<day-of-month>(ordinal) <named-month>",
-                                     -4.9028025892930405),
-                                    ("weekyear", -4.39197696552705),
-                                    ("hh:mmtomorrow", -4.61512051684126),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -5.308267697401205),
-                                    ("tomorrowat <time-of-day>", -4.055504728905837),
-                                    ("named-daythis <cycle>", -4.61512051684126),
-                                    ("named-daythe <day-of-month> (ordinal)", -5.308267697401205),
-                                    ("at <time-of-day>tomorrow", -4.9028025892930405),
-                                    ("last <cycle> of <time>year", -4.39197696552705),
-                                    ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.9028025892930405),
-                                    ("yearminute", -5.308267697401205)],
-                               n = 160},
-                   koData =
-                     ClassData{prior = -1.0360919316867756, unseen = -5.564520407322694,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -4.867534450455582),
-                                    ("dayhour", -3.258096538021482),
-                                    ("daymonth", -2.0343211063993665),
-                                    ("monthday", -3.3634570536793085),
-                                    ("monthyear", -3.951243718581427),
-                                    ("intersect by \"of\", \"from\", \"'s\"year",
-                                     -3.7689221617874726),
-                                    ("hourmonth", -4.462069342347418),
-                                    ("named-dayhh:mm", -4.867534450455582),
-                                    ("dayday", -4.867534450455582),
-                                    ("dd/mmat <time-of-day>", -3.951243718581427),
-                                    ("intersectnamed-month", -4.462069342347418),
-                                    ("dayyear", -3.481240089335692),
-                                    ("named-daythis <time>", -2.921624301400269),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -4.462069342347418),
-                                    ("minutemonth", -4.462069342347418),
-                                    ("named-monthyear", -3.951243718581427),
-                                    ("on <date>named-month", -4.462069342347418),
-                                    ("absorption of , after named daynamed-month",
-                                     -3.7689221617874726),
-                                    ("named-dayfrom <datetime> - <datetime> (interval)",
-                                     -3.7689221617874726),
-                                    ("named-dayintersect", -4.462069342347418),
-                                    ("named-month<day-of-month>(ordinal) <named-month>",
-                                     -3.951243718581427),
-                                    ("<hour-of-day> <integer> (as relative minutes)named-month",
-                                     -4.462069342347418),
-                                    ("named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.867534450455582),
-                                    ("yearmonth", -4.867534450455582),
-                                    ("until <time-of-day>on <date>", -4.867534450455582),
-                                    ("<named-month> <day-of-month> (ordinal)named-month",
-                                     -3.951243718581427),
-                                    ("dayminute", -3.258096538021482),
-                                    ("minuteday", -3.3634570536793085),
-                                    ("named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.867534450455582),
-                                    ("named-dayon <date>", -4.462069342347418),
-                                    ("named-dayat <time-of-day>", -3.951243718581427),
-                                    ("hh:mmon <date>", -3.481240089335692),
-                                    ("named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.462069342347418),
-                                    ("<day-of-month>(ordinal) <named-month> yearnamed-month",
-                                     -3.951243718581427),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -3.951243718581427),
-                                    ("<named-month> <day-of-month> (non ordinal)named-month",
-                                     -3.951243718581427),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -4.462069342347418),
-                                    ("minuteyear", -4.462069342347418),
-                                    ("yearminute", -4.462069342347418)],
-                               n = 88}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.7346010553881064),
-                                    ("ordinals (first..31st)week (grain)intersect",
-                                     -1.7346010553881064),
-                                    ("ordinals (first..31st)week (grain)named-month",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.2237754316221157),
-                                    ("ordinals (first..31st)day (grain)named-month",
-                                     -1.7346010553881064)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("season",
-        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}}),
-       ("year (grain)",
-        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}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.4816045409242156,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.824549292051046),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.740840023925201),
-                                    ("hh:mmhh:mm", -1.824549292051046),
-                                    ("hourhour", -2.740840023925201)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.2578291093020998, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.3141860046725258),
-                                    ("dayhour", -3.3141860046725258),
-                                    ("yearhour", -3.3141860046725258),
-                                    ("hh:mm<day-of-month> (ordinal)", -2.3978952727983707),
-                                    ("time-of-day (latent)<day-of-month> (ordinal)",
-                                     -3.3141860046725258),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.3141860046725258),
-                                    ("hh:mmtime-of-day (latent)", -2.3978952727983707),
-                                    ("minuteminute", -2.6210388241125804),
-                                    ("yearyear", -3.3141860046725258),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -3.3141860046725258),
-                                    ("dayday", -3.3141860046725258),
-                                    ("year (latent)year (latent)", -3.3141860046725258),
-                                    ("minutehour", -2.3978952727983707),
-                                    ("hh:mmintersect", -2.6210388241125804),
-                                    ("year (latent)time-of-day (latent)", -3.3141860046725258),
-                                    ("minuteday", -2.3978952727983707),
-                                    ("year (latent)<day-of-month> (ordinal)", -3.3141860046725258),
-                                    ("yearday", -3.3141860046725258)],
-                               n = 17}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6094379124341003),
-                                    ("month (grain)", -2.3025850929940455),
-                                    ("year (grain)", -2.3025850929940455),
-                                    ("week (grain)", -1.6094379124341003),
-                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
-                                    ("month", -2.3025850929940455),
-                                    ("quarter (grain)", -2.3025850929940455)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               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.6061358035703156,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0986122886681098),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.1972245773362196),
-                                    ("hh:mmhh:mm", -1.0986122886681098),
-                                    ("hourhour", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
-                                    ("minutehour", -0.9808292530117262)],
-                               n = 5}}),
-       ("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 = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3746934494414107),
-                                    ("integer (0..19)", -1.1631508098056809)],
-                               n = 30}}),
-       ("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.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)quarter (grain)year",
-                                     -1.252762968495368),
-                                    ("quarteryear", -0.8472978603872037),
-                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after lunch",
-        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}}),
-       ("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}}),
-       ("quarter to|till|before <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.0986122886681098),
-                                    ("noon", -1.5040773967762742), ("hour", -0.8109302162163288)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7472144018302211),
-                                    ("ordinals (first..31st)named-dayintersect",
-                                     -0.9985288301111273),
-                                    ("ordinals (first..31st)named-daynamed-month",
-                                     -1.845826690498331)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.7621400520468967),
-                                    ("ordinals (first..31st)named-daynamed-month",
-                                     -0.7621400520468967)],
-                               n = 6}}),
-       ("the <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..31st)",
-        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",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.174387269895637,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 63},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (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}}),
-       ("now",
-        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}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("morning", -0.6931471805599453)],
-                               n = 1}}),
-       ("<day-of-month>(ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.12921173148000623,
-                               unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -2.501435951739211),
-                                    ("ordinal (digits)named-month", -0.8527773261518292),
-                                    ("month", -0.7096764825111559)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -2.1102132003465894,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -1.7047480922384253),
-                                    ("ordinal (digits)named-month", -1.0116009116784799),
-                                    ("month", -0.7884573603642702)],
-                               n = 4}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 23}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("morning", -0.6931471805599453)],
-                               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.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)", -1.1786549963416462),
-                                    ("ordinal (digits)", -0.3677247801253174)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("afternoon",
-        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> from now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("second", -1.2039728043259361),
-                                    ("<integer> <unit-of-duration>", -1.2039728043259361),
-                                    ("a <unit-of-duration>", -1.6094379124341003),
-                                    ("minute", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("year (grain)", -1.8971199848858813),
-                                    ("week (grain)", -1.3862943611198906),
-                                    ("quarter", -2.3025850929940455), ("year", -1.8971199848858813),
-                                    ("quarter (grain)", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        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}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -1.006804739414987, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -5.129329438755058e-2),
-                                    ("integer (0..19)", -2.995732273553991)],
-                               n = 38},
-                   koData =
-                     ClassData{prior = -0.4547361571149472, unseen = -4.23410650459726,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.24921579162398486),
-                                    ("integer (0..19)", -1.5114575040738967)],
-                               n = 66}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.14842000511827333,
-                               unseen = -3.295836866004329,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 25},
-                   koData =
-                     ClassData{prior = -1.9810014688665833, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.0986122886681098),
-                                    ("daymonth", -0.8109302162163288),
-                                    ("named-dayintersect", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.6375773294051346, unseen = -4.59511985013459,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("integer (0..19)year (grain)", -3.891820298110627),
-                                    ("integer (numeric)day (grain)", -2.793208009442517),
-                                    ("couple, a pairhour (grain)", -3.891820298110627),
-                                    ("integer (0..19)hour (grain)", -3.891820298110627),
-                                    ("second", -3.1986731175506815),
-                                    ("integer (numeric)second (grain)", -3.891820298110627),
-                                    ("integer (numeric)year (grain)", -3.891820298110627),
-                                    ("day", -2.187072205872201), ("year", -3.4863551900024623),
-                                    ("integer (numeric)week (grain)", -3.1986731175506815),
-                                    ("integer (0..19)month (grain)", -3.891820298110627),
-                                    ("integer (0..19)second (grain)", -3.4863551900024623),
-                                    ("hour", -2.793208009442517), ("month", -3.4863551900024623),
-                                    ("integer (numeric)minute (grain)", -2.793208009442517),
-                                    ("integer (0..19)minute (grain)", -2.9755295662364714),
-                                    ("integer (numeric)month (grain)", -3.891820298110627),
-                                    ("minute", -2.2823823856765264),
-                                    ("integer (numeric)hour (grain)", -3.1986731175506815),
-                                    ("integer (0..19)day (grain)", -2.793208009442517),
-                                    ("integer (0..19)week (grain)", -3.1986731175506815)],
-                               n = 37},
-                   koData =
-                     ClassData{prior = -0.7519876805828788, unseen = -4.51085950651685,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.70805020110221),
-                                    ("integer (0..19)year (grain)", -3.4011973816621555),
-                                    ("integer (numeric)day (grain)", -3.1135153092103742),
-                                    ("integer (numeric)quarter (grain)", -3.8066624897703196),
-                                    ("integer (0..19)hour (grain)", -3.8066624897703196),
-                                    ("second", -2.890371757896165),
-                                    ("integer (numeric)second (grain)", -3.4011973816621555),
-                                    ("integer (numeric)year (grain)", -3.1135153092103742),
-                                    ("day", -2.70805020110221), ("quarter", -3.8066624897703196),
-                                    ("year", -2.70805020110221),
-                                    ("integer (numeric)week (grain)", -3.4011973816621555),
-                                    ("integer (0..19)month (grain)", -3.1135153092103742),
-                                    ("integer (0..19)second (grain)", -3.4011973816621555),
-                                    ("hour", -2.890371757896165), ("month", -2.70805020110221),
-                                    ("integer (numeric)minute (grain)", -3.4011973816621555),
-                                    ("integer (0..19)minute (grain)", -3.4011973816621555),
-                                    ("integer (numeric)month (grain)", -3.4011973816621555),
-                                    ("minute", -2.890371757896165),
-                                    ("integer (numeric)hour (grain)", -3.1135153092103742),
-                                    ("integer (0..19)day (grain)", -3.4011973816621555),
-                                    ("integer (0..19)week (grain)", -3.1135153092103742)],
-                               n = 33}}),
-       ("relative minutes after|past <integer> (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}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("hour (grain)", -2.4849066497880004),
-                                    ("second", -2.0794415416798357),
-                                    ("week (grain)", -2.0794415416798357),
-                                    ("day", -2.4849066497880004),
-                                    ("minute (grain)", -2.4849066497880004),
-                                    ("second (grain)", -2.0794415416798357),
-                                    ("hour", -2.4849066497880004), ("minute", -2.4849066497880004),
-                                    ("day (grain)", -2.4849066497880004)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -8.855339734144506e-2,
-                               unseen = -4.948759890378168,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month> <day-of-month> (ordinal)intersect",
-                                     -4.248495242049359),
-                                    ("at <time-of-day>named-day", -4.248495242049359),
-                                    ("intersect by \",\"year", -3.8430301339411947),
-                                    ("hh:mmintersect by \",\"", -3.8430301339411947),
-                                    ("dayday", -1.8971199848858813),
-                                    ("hh:mmnamed-day", -4.248495242049359),
-                                    ("named-dayintersect by \",\"", -3.332204510175204),
-                                    ("named-day<named-month> <day-of-month> (ordinal)",
-                                     -3.1498829533812494),
-                                    ("dayyear", -2.744417845273085),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.248495242049359),
-                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
-                                     -3.8430301339411947),
-                                    ("<named-month> <day-of-month> (non ordinal)named-day",
-                                     -4.248495242049359),
-                                    ("named-day<day-of-month> (non ordinal) <named-month>",
-                                     -3.5553480614894135),
-                                    ("named-day<named-month> <day-of-month> (non ordinal)",
-                                     -3.1498829533812494),
-                                    ("hh:mmintersect", -3.8430301339411947),
-                                    ("intersect by \",\"intersect", -3.8430301339411947),
-                                    ("named-dayintersect", -3.8430301339411947),
-                                    ("at <time-of-day>intersect", -3.8430301339411947),
-                                    ("dayminute", -2.5437471498109336),
-                                    ("intersectyear", -3.8430301339411947),
-                                    ("minuteday", -2.108429078553088),
-                                    ("hh:mmabsorption of , after named day", -4.248495242049359),
-                                    ("at <time-of-day>intersect by \",\"", -3.8430301339411947),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -4.248495242049359),
-                                    ("intersectintersect", -3.8430301339411947),
-                                    ("intersect by \",\"<day-of-month>(ordinal) <named-month>",
-                                     -3.8430301339411947),
-                                    ("named-day<day-of-month>(ordinal) <named-month>",
-                                     -3.5553480614894135),
-                                    ("<named-month> <day-of-month> (ordinal)named-day",
-                                     -4.248495242049359),
-                                    ("<named-month> <day-of-month> (ordinal)year",
-                                     -3.8430301339411947),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -3.8430301339411947)],
-                               n = 54},
-                   koData =
-                     ClassData{prior = -2.468099531471619, unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.9459101490553135),
-                                    ("daymonth", -1.9459101490553135)],
-                               n = 5}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -2.197890671877523e-2,
-                               unseen = -3.8501476017100584,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 45},
-                   koData =
-                     ClassData{prior = -3.828641396489095, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <integer> (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}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.248495242049359,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 68},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        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}}),
-       ("<time-of-day> sharp",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.2992829841302609),
-                                    ("time-of-day (latent)", -1.2992829841302609),
-                                    ("hour", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect by \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.8649974374866046,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.4816045409242156),
-                                    ("daymonth", -1.1451323043030026),
-                                    ("named-daylast <cycle>", -2.3978952727983707),
-                                    ("named-daynext <cycle>", -2.3978952727983707),
-                                    ("named-dayintersect", -1.9924301646902063),
-                                    ("dayweek", -1.9924301646902063)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.5465437063680699, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -1.3862943611198906),
-                                    ("daymonth", -0.8472978603872037),
-                                    ("named-dayintersect", -1.540445040947149)],
-                               n = 11}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716), ("day", -1.8562979903656263),
-                                    ("year", -2.367123614131617),
-                                    ("<integer> <unit-of-duration>", -0.9007865453381898),
-                                    ("a <unit-of-duration>", -2.772588722239781),
-                                    ("month", -2.367123614131617)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -2.8134107167600364, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.6094379124341003),
-                                    ("named-day", -1.6094379124341003),
-                                    ("hour", -2.0149030205422647),
-                                    ("week-end", -2.0149030205422647)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -6.187540371808753e-2,
-                               unseen = -4.6443908991413725,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("year (latent)", -1.7443572303334711),
-                                    ("day", -1.9956716586143772),
-                                    ("time-of-day (latent)", -1.7443572303334711),
-                                    ("year", -1.7443572303334711),
-                                    ("named-day", -3.536116699561526),
-                                    ("intersect by \"of\", \"from\", \"'s\"", -3.536116699561526),
-                                    ("<day-of-month> (ordinal)", -2.33214389523559),
-                                    ("hour", -1.7443572303334711)],
-                               n = 47}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -1.0360919316867756, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)", -1.1786549963416462),
-                                    ("ordinal (digits)", -0.3677247801253174)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -0.4382549309311553,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList [("ordinal (digits)", -4.652001563489282e-2)],
-                               n = 20}}),
-       ("the day after tomorrow",
-        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}}),
-       ("noon",
-        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.2876820724517809, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -0.8873031950009028),
-                                    ("hour", -0.8873031950009028)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.5040773967762742),
-                                    ("hh:mm", -1.5040773967762742),
-                                    ("minute", -1.0986122886681098)],
-                               n = 2}}),
-       ("<integer> and an half hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.6931471805599453),
-                                    ("integer (0..19)", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("after <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("evening",
-        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}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -1.791759469228055),
-                                    ("day", -1.0986122886681098),
-                                    ("named-day", -1.0986122886681098),
-                                    ("month", -1.791759469228055)],
-                               n = 4}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5040773967762742),
-                                    ("month (grain)", -2.1972245773362196),
-                                    ("year (grain)", -2.1972245773362196),
-                                    ("week (grain)", -1.5040773967762742),
-                                    ("year", -2.1972245773362196), ("month", -2.1972245773362196)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6739764335716716),
-                                    ("week (grain)", -1.6739764335716716),
-                                    ("day", -1.6739764335716716),
-                                    ("day (grain)", -1.6739764335716716)],
-                               n = 4}}),
-       ("christmas",
-        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 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 = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.793208009442517),
-                                    ("integer (0..19)year (grain)", -3.1986731175506815),
-                                    ("integer (numeric)day (grain)", -3.1986731175506815),
-                                    ("integer (0..19)hour (grain)", -3.1986731175506815),
-                                    ("second", -2.793208009442517),
-                                    ("integer (numeric)second (grain)", -3.1986731175506815),
-                                    ("integer (numeric)year (grain)", -3.1986731175506815),
-                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
-                                    ("integer (numeric)week (grain)", -3.1986731175506815),
-                                    ("integer (0..19)month (grain)", -3.1986731175506815),
-                                    ("integer (0..19)second (grain)", -3.1986731175506815),
-                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
-                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
-                                    ("integer (0..19)minute (grain)", -3.1986731175506815),
-                                    ("integer (numeric)month (grain)", -3.1986731175506815),
-                                    ("minute", -2.793208009442517),
-                                    ("integer (numeric)hour (grain)", -3.1986731175506815),
-                                    ("integer (0..19)day (grain)", -3.1986731175506815),
-                                    ("integer (0..19)week (grain)", -3.1986731175506815)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.3694478524670215,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.258096538021482),
-                                    ("<integer> more <unit-of-duration>", -3.258096538021482),
-                                    ("number.number hours", -3.6635616461296463),
-                                    ("second", -2.9704144655697013), ("day", -2.5649493574615367),
-                                    ("half an hour", -3.6635616461296463),
-                                    ("<integer> <unit-of-duration>", -1.3121863889661687),
-                                    ("a <unit-of-duration>", -2.5649493574615367),
-                                    ("<integer> and an half hours", -3.258096538021482),
-                                    ("hour", -2.4107986776342782), ("minute", -1.466337068793427),
-                                    ("about <duration>", -3.258096538021482)],
-                               n = 33},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.579818495252942, unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month>(ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
-                                     -2.498699971920336),
-                                    ("<day-of-month> (non ordinal) <named-month><day-of-month>(ordinal) <named-month>",
-                                     -2.498699971920336),
-                                    ("minuteminute", -2.093234863812172),
-                                    ("hh:mmhh:mm", -2.093234863812172),
-                                    ("dayday", -1.2459370034249682),
-                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
-                                     -2.498699971920336),
-                                    ("<day-of-month>(ordinal) <named-month><day-of-month>(ordinal) <named-month>",
-                                     -2.498699971920336)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -0.8209805520698302, unseen = -4.127134385045092,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -1.7129785913749407),
-                                    ("minuteminute", -2.164963715117998),
-                                    ("hh:mmhh:mm", -3.417726683613366),
-                                    ("dayyear", -3.012261575505202),
-                                    ("year<hour-of-day> <integer> (as relative minutes)",
-                                     -3.012261575505202),
-                                    ("hh:mmintersect", -2.3191143949452564),
-                                    ("named-month<day-of-month>(ordinal) <named-month>",
-                                     -2.3191143949452564),
-                                    ("dd/mmyear", -3.012261575505202),
-                                    ("named-month<day-of-month> (non ordinal) <named-month>",
-                                     -2.3191143949452564),
-                                    ("<hour-of-day> <integer> (as relative minutes)year",
-                                     -3.012261575505202),
-                                    ("minuteyear", -3.012261575505202),
-                                    ("yearminute", -3.012261575505202)],
-                               n = 22}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.7985076962177716),
-                                    ("hh:mmhh:mm", -0.7985076962177716)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.8754687373538999),
-                                    ("minuteminute", -2.4849066497880004),
-                                    ("hh:mmhh:mm", -2.4849066497880004),
-                                    ("minutehour", -0.8754687373538999)],
-                               n = 10}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.6026896854443837),
-                                    ("integer (0..19)year (grain)", -3.295836866004329),
-                                    ("integer (numeric)day (grain)", -2.890371757896165),
-                                    ("second", -2.890371757896165),
-                                    ("integer (numeric)second (grain)", -3.295836866004329),
-                                    ("integer (numeric)year (grain)", -2.890371757896165),
-                                    ("day", -2.6026896854443837), ("year", -2.6026896854443837),
-                                    ("integer (numeric)week (grain)", -3.295836866004329),
-                                    ("integer (0..19)month (grain)", -2.890371757896165),
-                                    ("integer (0..19)second (grain)", -3.295836866004329),
-                                    ("hour", -3.295836866004329), ("month", -2.6026896854443837),
-                                    ("integer (numeric)minute (grain)", -3.295836866004329),
-                                    ("integer (0..19)minute (grain)", -3.295836866004329),
-                                    ("integer (numeric)month (grain)", -3.295836866004329),
-                                    ("minute", -2.890371757896165),
-                                    ("integer (numeric)hour (grain)", -3.295836866004329),
-                                    ("integer (0..19)day (grain)", -3.295836866004329),
-                                    ("integer (0..19)week (grain)", -2.890371757896165)],
-                               n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-monthinteger (numeric)", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 5}}),
-       ("<day-of-month> (non ordinal) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.1466034741918754, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -1.9924301646902063,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 3}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = -1.9212175364649418,
-                               unseen = -3.7612001156935624,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 41},
-                   koData =
-                     ClassData{prior = -0.158326051237739, unseen = -5.484796933490655,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 239}}),
-       ("quarter (grain)",
-        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}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.4816045409242156),
-                                    ("week (grain)named-month", -1.9924301646902063),
-                                    ("day (grain)intersect", -1.9924301646902063),
-                                    ("weekmonth", -1.4816045409242156),
-                                    ("day (grain)named-month", -1.9924301646902063),
-                                    ("week (grain)intersect", -1.9924301646902063)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..31st)named-month", -1.466337068793427),
-                                    ("ordinal (digits)named-month", -1.1786549963416462),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.8109302162163288,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)named-month", -0.7884573603642702),
-                                    ("month", -0.7884573603642702)],
-                               n = 4}}),
-       ("morning",
-        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}}),
-       ("week-end",
-        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}}),
-       ("after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.7227665977411035),
-                                    ("intersect", -2.2335922215070942),
-                                    ("tomorrow", -2.2335922215070942), ("day", -2.2335922215070942),
-                                    ("hour", -1.3862943611198906)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("lunch", -2.772588722239781),
-                                    ("year (latent)", -2.0794415416798357),
-                                    ("day", -2.367123614131617),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("year", -2.0794415416798357), ("hh:mm", -2.772588722239781),
-                                    ("<day-of-month> (ordinal)", -2.367123614131617),
-                                    ("hour", -1.8562979903656263), ("minute", -2.772588722239781)],
-                               n = 10}}),
-       ("day (grain)",
-        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}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-month", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer> (as relative minutes)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (numeric)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 10}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2992829841302609,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.917770732084279), ("intersect", -2.512305623976115),
-                                    ("season", -2.001480000210124),
-                                    ("next <cycle>", -2.917770732084279),
-                                    ("named-month", -2.512305623976115),
-                                    ("day", -2.001480000210124), ("hour", -2.2246235515243336),
-                                    ("month", -2.001480000210124),
-                                    ("week-end", -2.2246235515243336)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.3184537311185346, unseen = -4.356708826689592,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.8588987720656835),
-                                    ("named-month", -1.5105920777974677),
-                                    ("day", -3.6506582412937383),
-                                    ("time-of-day (latent)", -3.245193133185574),
-                                    ("<day-of-month> (ordinal)", -3.6506582412937383),
-                                    ("noon", -3.6506582412937383), ("hour", -2.7343675094195836),
-                                    ("month", -1.0116009116784799),
-                                    ("morning", -3.6506582412937383)],
-                               n = 32}}),
-       ("<named-month> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month", -0.6931471805599453),
-                                    ("named-monthordinal (digits)", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month", -0.6931471805599453),
-                                    ("named-monthordinal (digits)", -0.6931471805599453)],
-                               n = 5}}),
-       ("within <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.6931471805599453),
-                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/SV_XX.hs b/Duckling/Ranking/Classifiers/SV_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/SV_XX.hs
@@ -0,0 +1,1635 @@
+-- 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.SV_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.2039728043259361),
+                                    ("hh:mm", -1.6094379124341003), ("hour", -1.6094379124341003),
+                                    ("minute", -1.2039728043259361)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.7600866632350547, unseen = -4.882801922586371,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 130},
+                   koData =
+                     ClassData{prior = -0.630408839926522, unseen = -5.0106352940962555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 148}}),
+       ("the day before yesterday",
+        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}}),
+       ("lunch",
+        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}}),
+       ("Tisdag",
+        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 (20..90)",
+        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> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.9555114450274363),
+                                    ("tomorrowevening", -1.8718021769015913),
+                                    ("tomorrowlunch", -1.8718021769015913),
+                                    ("yesterdayevening", -1.8718021769015913),
+                                    ("Mandagmorning", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("couple, a pair",
+        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/mm",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("today",
+        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}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.2607262624632527, unseen = -4.624972813284271,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.5165082281731497),
+                                    ("time-of-day (latent)", -1.2139231351791042),
+                                    ("relative minutes after|past <integer> (hour-of-day)",
+                                     -3.5165082281731497),
+                                    ("hh:mm", -2.0501711593797225),
+                                    ("<time-of-day> sharp", -3.5165082281731497),
+                                    ("hour", -1.149384614041533), ("minute", -1.7819071727850433)],
+                               n = 47},
+                   koData =
+                     ClassData{prior = -1.4718165345580525, unseen = -3.58351893845611,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.8472978603872037),
+                                    ("hour", -0.8472978603872037)],
+                               n = 14}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sondag", -2.3978952727983707),
+                                    ("Mandag", -1.7047480922384253),
+                                    ("Lordag", -2.3978952727983707), ("day", -0.8938178760220964),
+                                    ("Onsdag", -2.3978952727983707),
+                                    ("Fredag", -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        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}}),
+       ("tonight",
+        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}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.48285177172358457,
+                               unseen = -4.304065093204169,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -3.597312260588446),
+                                    ("Mandag", -3.597312260588446), ("Torsdag", -2.211017899468555),
+                                    ("Lordag", -3.597312260588446),
+                                    ("the <day-of-month> (non ordinal)", -3.1918471524802814),
+                                    ("<day-of-month>(ordinal) <named-month>", -2.344549292093078),
+                                    ("day", -0.9231636111619171),
+                                    ("the <day-of-month> (ordinal)", -3.597312260588446),
+                                    ("afternoon", -3.597312260588446),
+                                    ("<day-of-month> (ordinal)", -2.093234863812172),
+                                    ("hour", -3.597312260588446),
+                                    ("<day-of-month> (non ordinal) <named-month>",
+                                     -3.597312260588446)],
+                               n = 29},
+                   koData =
+                     ClassData{prior = -0.9597758438138939, unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -2.322387720290225),
+                                    ("year (latent)", -1.8523840910444898),
+                                    ("time-of-day (latent)", -1.8523840910444898),
+                                    ("year", -1.62924053973028), ("hour", -1.62924053973028)],
+                               n = 18}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.16251892949777494, unseen = -3.58351893845611,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 34},
+                   koData =
+                     ClassData{prior = -1.8971199848858813,
+                               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.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.9808292530117262),
+                                    ("hh:mmhh:mm", -0.9808292530117262)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
+                                    ("minutehour", -0.9808292530117262)],
+                               n = 2}}),
+       ("between <datetime> and <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("hh:mmhh:mm", -1.0986122886681098)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.2992829841302609),
+                                    ("minuteminute", -1.7047480922384253),
+                                    ("minutehour", -1.2992829841302609),
+                                    ("hh:mmintersect", -1.7047480922384253)],
+                               n = 3}}),
+       ("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 = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)", -1.252762968495368),
+                                    ("integer (0..19)minute (grain)", -1.252762968495368),
+                                    ("minute", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> o'clock",
+        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}}),
+       ("Juli",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.11778303565638351,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -2.1972245773362196,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.252762968495368),
+                                    ("quarter", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.252762968495368),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.252762968495368),
+                                    ("quarter", -0.8472978603872037)],
+                               n = 2}}),
+       ("Last year",
+        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.4131871542020747,
+                               unseen = -5.8289456176102075,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Onsdagthis <cycle>", -5.1328529268205045),
+                                    ("Torsdag<time> timezone", -4.43970574626056),
+                                    ("<datetime> - <datetime> (interval)on <date>",
+                                     -4.034240638152395),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.034240638152395),
+                                    ("hourday", -5.1328529268205045),
+                                    ("dayhour", -2.8815611282140097),
+                                    ("daymonth", -2.992786763324234),
+                                    ("monthyear", -3.1179499062782403),
+                                    ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
+                                     -5.1328529268205045),
+                                    ("Mandagon <date>", -5.1328529268205045),
+                                    ("intersecthh:mm", -5.1328529268205045),
+                                    ("Torsdagbetween <datetime> and <datetime> (interval)",
+                                     -5.1328529268205045),
+                                    ("Torsdagat <time-of-day>", -4.727387818712341),
+                                    ("Marsyear", -5.1328529268205045),
+                                    ("intersect by \"of\", \"from\", \"'s\"year",
+                                     -4.727387818712341),
+                                    ("Oktoberyear", -3.5234150143864045),
+                                    ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.727387818712341),
+                                    ("Torsdagfrom <datetime> - <datetime> (interval)",
+                                     -4.727387818712341),
+                                    ("last <day-of-week> of <time>year", -5.1328529268205045),
+                                    ("todayat <time-of-day>", -4.727387818712341),
+                                    ("the <day-of-month> (ordinal)Februari", -5.1328529268205045),
+                                    ("dayday", -3.2610507499189136),
+                                    ("dd/mmat <time-of-day>", -4.21656219494635),
+                                    ("intersect by \",\"hh:mm", -4.21656219494635),
+                                    ("dayyear", -3.34109345759245),
+                                    ("tomorrow<time-of-day> sharp", -4.727387818712341),
+                                    ("<day-of-month>(ordinal) <named-month>year",
+                                     -4.727387818712341),
+                                    ("Onsdag<named-month> <day-of-month> (non ordinal)",
+                                     -5.1328529268205045),
+                                    ("Onsdagthis <time>", -4.43970574626056),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.034240638152395),
+                                    ("tomorrowuntil <time-of-day>", -4.727387818712341),
+                                    ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
+                                     -4.43970574626056),
+                                    ("after <time-of-day>at <time-of-day>", -4.727387818712341),
+                                    ("the <day-of-month> (ordinal)Mars", -4.034240638152395),
+                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
+                                     -4.727387818712341),
+                                    ("Mandagthis <cycle>", -5.1328529268205045),
+                                    ("tomorrowafter <time-of-day>", -4.727387818712341),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.21656219494635),
+                                    ("dayminute", -2.7814776696570274),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -4.43970574626056),
+                                    ("on <date>Mars", -4.034240638152395),
+                                    ("<ordinal> <cycle> of <time>year", -4.727387818712341),
+                                    ("minuteday", -2.5301632413761213),
+                                    ("absorption of , after named dayintersect",
+                                     -5.1328529268205045),
+                                    ("yearhh:mm", -5.1328529268205045),
+                                    ("Tisdagthis <time>", -4.727387818712341),
+                                    ("Onsdagnext <cycle>", -5.1328529268205045),
+                                    ("absorption of , after named dayintersect by \",\"",
+                                     -4.727387818712341),
+                                    ("Sondaglast <cycle>", -5.1328529268205045),
+                                    ("dd/mmyear", -4.727387818712341),
+                                    ("Septemberyear", -4.21656219494635),
+                                    ("at <time-of-day>on <date>", -5.1328529268205045),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -5.1328529268205045),
+                                    ("between <datetime> and <datetime> (interval)on <date>",
+                                     -5.1328529268205045),
+                                    ("dayweek", -3.880089958325137),
+                                    ("Tisdagthis <cycle>", -5.1328529268205045),
+                                    ("on <date>Februari", -5.1328529268205045),
+                                    ("weekyear", -4.21656219494635),
+                                    ("hh:mmtomorrow", -4.43970574626056),
+                                    ("tomorrowat <time-of-day>", -3.880089958325137),
+                                    ("at <time-of-day>tomorrow", -4.727387818712341),
+                                    ("Sondag<day-of-month> (non ordinal) <named-month>",
+                                     -5.1328529268205045),
+                                    ("last <cycle> of <time>year", -4.21656219494635),
+                                    ("<day-of-month> (non ordinal) <named-month>year",
+                                     -4.727387818712341),
+                                    ("yearminute", -5.1328529268205045)],
+                               n = 129},
+                   koData =
+                     ClassData{prior = -1.0833448165373212, unseen = -5.365976015021851,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("OnsdagFebruari", -4.66814498514948),
+                                    ("dayhour", -3.164067588373206),
+                                    ("daymonth", -2.103195627687943),
+                                    ("monthday", -3.751854253275325),
+                                    ("monthyear", -3.751854253275325),
+                                    ("Torsdagbetween <time-of-day> and <time-of-day> (interval)",
+                                     -4.66814498514948),
+                                    ("Mandagon <date>", -4.2626798770413155),
+                                    ("Torsdagbetween <datetime> and <datetime> (interval)",
+                                     -4.66814498514948),
+                                    ("Torsdagat <time-of-day>", -3.751854253275325),
+                                    ("Marsyear", -3.9749978045895347),
+                                    ("intersect by \"of\", \"from\", \"'s\"year",
+                                     -3.56953269648137),
+                                    ("Torsdagfrom <time-of-day> - <time-of-day> (interval)",
+                                     -4.66814498514948),
+                                    ("Torsdagfrom <datetime> - <datetime> (interval)",
+                                     -4.2626798770413155),
+                                    ("Mandagintersect", -4.2626798770413155),
+                                    ("absorption of , after named dayJuli", -4.2626798770413155),
+                                    ("hourmonth", -4.2626798770413155),
+                                    ("dd/mmat <time-of-day>", -3.751854253275325),
+                                    ("dayyear", -3.2818506240295893),
+                                    ("<named-month> <day-of-month> (non ordinal)Augusti",
+                                     -3.751854253275325),
+                                    ("Augusti<day-of-month> (non ordinal) <named-month>",
+                                     -3.751854253275325),
+                                    ("Onsdagthis <time>", -3.4153820166541116),
+                                    ("Aprilyear", -4.66814498514948),
+                                    ("yearmonth", -4.66814498514948),
+                                    ("until <time-of-day>on <date>", -4.66814498514948),
+                                    ("Torsdaghh:mm", -4.66814498514948),
+                                    ("dayminute", -3.2818506240295893),
+                                    ("minuteday", -3.164067588373206),
+                                    ("Tisdagthis <time>", -3.751854253275325),
+                                    ("hh:mmon <date>", -3.2818506240295893),
+                                    ("on <date>Februari", -4.2626798770413155),
+                                    ("absorption of , after named dayFebruari",
+                                     -3.9749978045895347),
+                                    ("intersectFebruari", -4.2626798770413155),
+                                    ("Mandagthis <time>", -4.66814498514948),
+                                    ("Sondagthis <time>", -4.2626798770413155)],
+                               n = 66}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.7346010553881064),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)Oktober",
+                                     -1.7346010553881064),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -1.7346010553881064),
+                                    ("weekmonth", -1.2237754316221157),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)Oktober",
+                                     -1.7346010553881064)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("season",
+        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}}),
+       ("year (grain)",
+        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}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.4350845252893227),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.3513752571634776),
+                                    ("hh:mmhh:mm", -1.4350845252893227),
+                                    ("hourhour", -2.3513752571634776)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.6741486494265287),
+                                    ("hh:mmtime-of-day (latent)", -1.7578579175523736),
+                                    ("minuteminute", -1.9810014688665833),
+                                    ("yearyear", -2.6741486494265287),
+                                    ("year (latent)year (latent)", -2.6741486494265287),
+                                    ("minutehour", -1.7578579175523736),
+                                    ("hh:mmintersect", -1.9810014688665833),
+                                    ("year (latent)time-of-day (latent)", -2.6741486494265287)],
+                               n = 9}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6094379124341003),
+                                    ("month (grain)", -2.3025850929940455),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -1.6094379124341003),
+                                    ("quarter", -2.3025850929940455), ("year", -2.3025850929940455),
+                                    ("month", -2.3025850929940455),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               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.6061358035703156,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.0986122886681098),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.1972245773362196),
+                                    ("hh:mmhh:mm", -1.0986122886681098),
+                                    ("hourhour", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.9808292530117262),
+                                    ("minutehour", -0.9808292530117262)],
+                               n = 5}}),
+       ("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 = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3894647667617233),
+                                    ("integer (0..19)", -1.1314021114911006)],
+                               n = 29}}),
+       ("Sondag",
+        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}}),
+       ("Mandag",
+        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}}),
+       ("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.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)quarter (grain)year",
+                                     -1.252762968495368),
+                                    ("quarteryear", -0.8472978603872037),
+                                    ("ordinal (digits)quarter (grain)year", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after lunch",
+        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}}),
+       ("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}}),
+       ("Torsdag",
+        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}}),
+       ("quarter to|till|before <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.0986122886681098),
+                                    ("noon", -1.5040773967762742), ("hour", -0.8109302162163288)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lordag",
+        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}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)TisdagOktober",
+                                     -1.9924301646902063),
+                                    ("daymonth", -0.8938178760220964),
+                                    ("ordinals (first..twentieth,thirtieth,...)Onsdagintersect",
+                                     -1.4816045409242156),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tisdagintersect",
+                                     -1.9924301646902063)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9444616088408514),
+                                    ("ordinals (first..twentieth,thirtieth,...)OnsdagOktober",
+                                     -1.2809338454620642),
+                                    ("ordinals (first..twentieth,thirtieth,...)TisdagSeptember",
+                                     -1.791759469228055)],
+                               n = 6}}),
+       ("the <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 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}}),
+       ("week (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}}),
+       ("now",
+        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}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("morning", -0.6931471805599453)],
+                               n = 1}}),
+       ("<day-of-month>(ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)Mars",
+                                     -1.6094379124341003),
+                                    ("ordinal (digits)Februari", -2.120263536200091),
+                                    ("month", -0.8209805520698302),
+                                    ("ordinal (digits)Mars", -1.6094379124341003)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)April",
+                                     -1.252762968495368),
+                                    ("month", -1.252762968495368)],
+                               n = 1}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 23}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("morning", -0.6931471805599453)],
+                               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.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tisdag", -0.6931471805599453), ("day", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.1786549963416462), ("Mars", -1.8718021769015913),
+                                    ("month", -1.8718021769015913), ("Onsdag", -1.8718021769015913),
+                                    ("Fredag", -1.466337068793427)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.916290731874155),
+                                    ("ordinal (digits)", -0.5108256237659907)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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> from now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("second", -1.2039728043259361),
+                                    ("<integer> <unit-of-duration>", -1.2039728043259361),
+                                    ("a <unit-of-duration>", -1.6094379124341003),
+                                    ("minute", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("year (grain)", -1.8971199848858813),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("quarter", -2.3025850929940455), ("year", -1.8971199848858813),
+                                    ("quarter (grain)", -2.3025850929940455)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        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}}),
+       ("Februari",
+        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}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.8950133334268701, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -5.129329438755058e-2),
+                                    ("integer (0..19)", -2.995732273553991)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -0.525266307920785, unseen = -4.060443010546419,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2363887780642304),
+                                    ("integer (0..19)", -1.55814461804655)],
+                               n = 55}}),
+       ("year",
+        Classifier{okData =
+                     ClassData{prior = -0.14842000511827333,
+                               unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 25},
+                   koData =
+                     ClassData{prior = -1.9810014688665833, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("Sondagintersect", -1.6094379124341003),
+                                    ("SondagMars", -1.6094379124341003),
+                                    ("MandagMars", -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.6231885919530349, unseen = -4.574710978503383,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6184380424125226),
+                                    ("integer (0..19)year (grain)", -3.871201010907891),
+                                    ("integer (numeric)day (grain)", -2.772588722239781),
+                                    ("couple, a pairhour (grain)", -3.871201010907891),
+                                    ("integer (0..19)hour (grain)", -3.871201010907891),
+                                    ("second", -3.1780538303479458),
+                                    ("integer (numeric)second (grain)", -3.871201010907891),
+                                    ("integer (numeric)year (grain)", -3.871201010907891),
+                                    ("day", -2.166452918669466), ("year", -3.4657359027997265),
+                                    ("integer (numeric)week (grain)", -3.1780538303479458),
+                                    ("integer (0..19)month (grain)", -3.871201010907891),
+                                    ("integer (0..19)second (grain)", -3.4657359027997265),
+                                    ("hour", -2.772588722239781), ("month", -3.4657359027997265),
+                                    ("integer (numeric)minute (grain)", -2.772588722239781),
+                                    ("integer (0..19)minute (grain)", -2.9549102790337356),
+                                    ("integer (numeric)month (grain)", -3.871201010907891),
+                                    ("minute", -2.2617630984737906),
+                                    ("integer (numeric)hour (grain)", -3.1780538303479458),
+                                    ("integer (0..19)day (grain)", -2.772588722239781),
+                                    ("integer (0..19)week (grain)", -3.1780538303479458)],
+                               n = 37},
+                   koData =
+                     ClassData{prior = -0.7683706017975328, unseen = -4.465908118654584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.662587827025453),
+                                    ("integer (0..19)year (grain)", -3.355735007585398),
+                                    ("integer (numeric)day (grain)", -3.068052935133617),
+                                    ("integer (0..19)hour (grain)", -3.7612001156935624),
+                                    ("second", -2.8449093838194073),
+                                    ("integer (numeric)second (grain)", -3.355735007585398),
+                                    ("integer (numeric)year (grain)", -3.068052935133617),
+                                    ("day", -2.662587827025453), ("year", -2.662587827025453),
+                                    ("integer (numeric)week (grain)", -3.355735007585398),
+                                    ("integer (0..19)month (grain)", -3.068052935133617),
+                                    ("integer (0..19)second (grain)", -3.355735007585398),
+                                    ("hour", -2.8449093838194073), ("month", -2.662587827025453),
+                                    ("integer (numeric)minute (grain)", -3.355735007585398),
+                                    ("integer (0..19)minute (grain)", -3.355735007585398),
+                                    ("integer (numeric)month (grain)", -3.355735007585398),
+                                    ("minute", -2.8449093838194073),
+                                    ("integer (numeric)hour (grain)", -3.068052935133617),
+                                    ("integer (0..19)day (grain)", -3.355735007585398),
+                                    ("integer (0..19)week (grain)", -3.068052935133617)],
+                               n = 32}}),
+       ("relative minutes after|past <integer> (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}}),
+       ("Oktober",
+        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}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.0794415416798357),
+                                    ("hour (grain)", -2.4849066497880004),
+                                    ("second", -2.0794415416798357),
+                                    ("week (grain)", -2.0794415416798357),
+                                    ("day", -2.4849066497880004),
+                                    ("minute (grain)", -2.4849066497880004),
+                                    ("second (grain)", -2.0794415416798357),
+                                    ("hour", -2.4849066497880004), ("minute", -2.4849066497880004),
+                                    ("day (grain)", -2.4849066497880004)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.1590646946296874, unseen = -4.51085950651685,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>Lordag", -3.8066624897703196),
+                                    ("Lordag<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("intersect by \",\"year", -3.8066624897703196),
+                                    ("hh:mmintersect by \",\"", -3.8066624897703196),
+                                    ("dayday", -2.1019143975318944),
+                                    ("dayyear", -2.890371757896165),
+                                    ("<named-month> <day-of-month> (non ordinal)intersect",
+                                     -3.8066624897703196),
+                                    ("Onsdag<named-month> <day-of-month> (non ordinal)",
+                                     -3.8066624897703196),
+                                    ("Fredagintersect by \",\"", -3.4011973816621555),
+                                    ("intersect by \",\"<day-of-month> (non ordinal) <named-month>",
+                                     -3.4011973816621555),
+                                    ("hh:mmintersect", -3.8066624897703196),
+                                    ("intersect by \",\"intersect", -3.8066624897703196),
+                                    ("at <time-of-day>intersect", -3.8066624897703196),
+                                    ("dayminute", -2.70805020110221),
+                                    ("intersectyear", -3.8066624897703196),
+                                    ("minuteday", -2.1019143975318944),
+                                    ("<named-month> <day-of-month> (non ordinal)Fredag",
+                                     -3.8066624897703196),
+                                    ("Fredag<named-month> <day-of-month> (non ordinal)",
+                                     -3.4011973816621555),
+                                    ("hh:mmabsorption of , after named day", -3.8066624897703196),
+                                    ("at <time-of-day>intersect by \",\"", -3.8066624897703196),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -3.8066624897703196),
+                                    ("intersectintersect", -3.8066624897703196),
+                                    ("Fredagintersect", -3.8066624897703196),
+                                    ("Mandag<named-month> <day-of-month> (non ordinal)",
+                                     -3.4011973816621555),
+                                    ("Mandag<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("Sondag<day-of-month> (non ordinal) <named-month>",
+                                     -3.8066624897703196),
+                                    ("<named-month> <day-of-month> (non ordinal)year",
+                                     -3.4011973816621555),
+                                    ("hh:mmLordag", -3.8066624897703196)],
+                               n = 29},
+                   koData =
+                     ClassData{prior = -1.916922612182061, unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("OnsdagFebruari", -3.044522437723423),
+                                    ("daymonth", -1.9459101490553135),
+                                    ("MandagFebruari", -2.639057329615259),
+                                    ("FredagJuli", -2.639057329615259)],
+                               n = 5}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -2.197890671877523e-2,
+                               unseen = -3.8501476017100584,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 45},
+                   koData =
+                     ClassData{prior = -3.828641396489095, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("quarter after|past <integer> (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}}),
+       ("second (grain)",
+        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}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        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}}),
+       ("<time-of-day> sharp",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.2992829841302609),
+                                    ("time-of-day (latent)", -1.2992829841302609),
+                                    ("hour", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mars",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.8649974374866046, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("OnsdagOktober", -2.2335922215070942),
+                                    ("TisdagOktober", -2.2335922215070942),
+                                    ("Onsdagintersect", -2.2335922215070942),
+                                    ("Onsdagnext <cycle>", -2.639057329615259),
+                                    ("Sondaglast <cycle>", -2.639057329615259),
+                                    ("dayweek", -2.2335922215070942)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.5465437063680699,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.041453874828161),
+                                    ("OnsdagOktober", -2.4277482359480516),
+                                    ("Sondagintersect", -2.833213344056216),
+                                    ("TisdagSeptember", -2.4277482359480516),
+                                    ("Tisdagintersect", -2.4277482359480516),
+                                    ("Onsdagintersect", -2.4277482359480516),
+                                    ("SondagMars", -2.833213344056216),
+                                    ("MandagMars", -2.833213344056216)],
+                               n = 11}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716), ("day", -1.8562979903656263),
+                                    ("year", -2.367123614131617),
+                                    ("<integer> <unit-of-duration>", -0.9007865453381898),
+                                    ("a <unit-of-duration>", -2.772588722239781),
+                                    ("month", -2.367123614131617)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -2.6149597780361984, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tisdag", -2.0794415416798357),
+                                    ("Sondag", -2.0794415416798357), ("day", -1.6739764335716716),
+                                    ("hour", -2.0794415416798357),
+                                    ("week-end", -2.0794415416798357)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -7.598590697792199e-2,
+                               unseen = -4.465908118654584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -1.563975538357343),
+                                    ("Sondag", -3.7612001156935624),
+                                    ("Mandag", -3.7612001156935624), ("day", -2.8449093838194073),
+                                    ("time-of-day (latent)", -1.563975538357343),
+                                    ("year", -1.563975538357343),
+                                    ("intersect by \"of\", \"from\", \"'s\"", -3.355735007585398),
+                                    ("hour", -1.563975538357343)],
+                               n = 38}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.916290731874155),
+                                    ("ordinal (digits)", -0.5108256237659907)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the day after tomorrow",
+        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}}),
+       ("noon",
+        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.2876820724517809, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -0.8873031950009028),
+                                    ("hour", -0.8873031950009028)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.5040773967762742),
+                                    ("hh:mm", -1.5040773967762742),
+                                    ("minute", -1.0986122886681098)],
+                               n = 2}}),
+       ("Augusti",
+        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> and an half hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.6931471805599453),
+                                    ("integer (0..19)", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("after <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("evening",
+        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}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tisdag", -2.0149030205422647),
+                                    ("Mandag", -2.0149030205422647), ("day", -1.3217558399823195),
+                                    ("Mars", -2.0149030205422647), ("month", -2.0149030205422647),
+                                    ("Onsdag", -2.0149030205422647)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.3217558399823195), ("Mars", -2.0149030205422647),
+                                    ("month", -2.0149030205422647), ("Onsdag", -2.0149030205422647),
+                                    ("Fredag", -1.6094379124341003)],
+                               n = 4}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.7047480922384253),
+                                    ("month (grain)", -2.3978952727983707),
+                                    ("year (grain)", -1.7047480922384253),
+                                    ("week (grain)", -1.7047480922384253),
+                                    ("year", -1.7047480922384253), ("month", -2.3978952727983707)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -1.0116009116784799, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6739764335716716),
+                                    ("week (grain)", -1.6739764335716716),
+                                    ("day", -1.6739764335716716),
+                                    ("day (grain)", -1.6739764335716716)],
+                               n = 4}}),
+       ("Onsdag",
+        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}}),
+       ("christmas",
+        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 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 = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.793208009442517),
+                                    ("integer (0..19)year (grain)", -3.1986731175506815),
+                                    ("integer (numeric)day (grain)", -3.1986731175506815),
+                                    ("integer (0..19)hour (grain)", -3.1986731175506815),
+                                    ("second", -2.793208009442517),
+                                    ("integer (numeric)second (grain)", -3.1986731175506815),
+                                    ("integer (numeric)year (grain)", -3.1986731175506815),
+                                    ("day", -2.793208009442517), ("year", -2.793208009442517),
+                                    ("integer (numeric)week (grain)", -3.1986731175506815),
+                                    ("integer (0..19)month (grain)", -3.1986731175506815),
+                                    ("integer (0..19)second (grain)", -3.1986731175506815),
+                                    ("hour", -2.793208009442517), ("month", -2.793208009442517),
+                                    ("integer (numeric)minute (grain)", -3.1986731175506815),
+                                    ("integer (0..19)minute (grain)", -3.1986731175506815),
+                                    ("integer (numeric)month (grain)", -3.1986731175506815),
+                                    ("minute", -2.793208009442517),
+                                    ("integer (numeric)hour (grain)", -3.1986731175506815),
+                                    ("integer (0..19)day (grain)", -3.1986731175506815),
+                                    ("integer (0..19)week (grain)", -3.1986731175506815)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Fredag",
+        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}}),
+       ("in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.3694478524670215,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.258096538021482),
+                                    ("<integer> more <unit-of-duration>", -3.258096538021482),
+                                    ("number.number hours", -3.6635616461296463),
+                                    ("second", -2.9704144655697013), ("day", -2.5649493574615367),
+                                    ("half an hour", -3.6635616461296463),
+                                    ("<integer> <unit-of-duration>", -1.3121863889661687),
+                                    ("a <unit-of-duration>", -2.5649493574615367),
+                                    ("<integer> and an half hours", -3.258096538021482),
+                                    ("hour", -2.4107986776342782), ("minute", -1.466337068793427),
+                                    ("about <duration>", -3.258096538021482)],
+                               n = 33},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.3862943611198906),
+                                    ("hh:mmhh:mm", -1.3862943611198906),
+                                    ("dayday", -1.791759469228055),
+                                    ("<day-of-month> (non ordinal) <named-month><day-of-month> (non ordinal) <named-month>",
+                                     -1.791759469228055)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juli<day-of-month> (non ordinal) <named-month>",
+                                     -2.890371757896165),
+                                    ("monthday", -1.791759469228055),
+                                    ("minuteminute", -1.6376087894007967),
+                                    ("hh:mmhh:mm", -2.890371757896165),
+                                    ("dayyear", -2.4849066497880004),
+                                    ("Augusti<day-of-month> (non ordinal) <named-month>",
+                                     -1.9740810260220096),
+                                    ("hh:mmintersect", -1.791759469228055),
+                                    ("dd/mmyear", -2.4849066497880004)],
+                               n = 13}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.8109302162163288, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.7985076962177716),
+                                    ("hh:mmhh:mm", -0.7985076962177716)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.587786664902119, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.8754687373538999),
+                                    ("minuteminute", -2.4849066497880004),
+                                    ("hh:mmhh:mm", -2.4849066497880004),
+                                    ("minutehour", -0.8754687373538999)],
+                               n = 10}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.6026896854443837),
+                                    ("integer (0..19)year (grain)", -3.295836866004329),
+                                    ("integer (numeric)day (grain)", -2.890371757896165),
+                                    ("second", -2.890371757896165),
+                                    ("integer (numeric)second (grain)", -3.295836866004329),
+                                    ("integer (numeric)year (grain)", -2.890371757896165),
+                                    ("day", -2.6026896854443837), ("year", -2.6026896854443837),
+                                    ("integer (numeric)week (grain)", -3.295836866004329),
+                                    ("integer (0..19)month (grain)", -2.890371757896165),
+                                    ("integer (0..19)second (grain)", -3.295836866004329),
+                                    ("hour", -3.295836866004329), ("month", -2.6026896854443837),
+                                    ("integer (numeric)minute (grain)", -3.295836866004329),
+                                    ("integer (0..19)minute (grain)", -3.295836866004329),
+                                    ("integer (numeric)month (grain)", -3.295836866004329),
+                                    ("minute", -2.890371757896165),
+                                    ("integer (numeric)hour (grain)", -3.295836866004329),
+                                    ("integer (0..19)day (grain)", -3.295836866004329),
+                                    ("integer (0..19)week (grain)", -2.890371757896165)],
+                               n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Aprilinteger (numeric)", -2.4423470353692043),
+                                    ("Februariinteger (numeric)", -1.3437347467010947),
+                                    ("month", -0.832909122935104),
+                                    ("Juliinteger (numeric)", -1.749199854809259)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581, unseen = -2.772588722239781,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustiinteger (numeric)", -1.0986122886681098),
+                                    ("Aprilinteger (numeric)", -2.0149030205422647),
+                                    ("month", -0.916290731874155)],
+                               n = 5}}),
+       ("<day-of-month> (non ordinal) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.1466034741918754, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)September", -3.1135153092103742),
+                                    ("integer (numeric)Augusti", -1.5040773967762742),
+                                    ("integer (numeric)April", -3.1135153092103742),
+                                    ("month", -0.8109302162163288),
+                                    ("integer (numeric)Februari", -2.1972245773362196),
+                                    ("integer (numeric)Juli", -2.70805020110221),
+                                    ("integer (numeric)Mars", -2.70805020110221)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -1.9924301646902063, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month", -1.1786549963416462),
+                                    ("integer (numeric)Juli", -1.1786549963416462)],
+                               n = 3}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tisdag", -1.7047480922384253),
+                                    ("Mandag", -1.7047480922384253), ("day", -1.0116009116784799),
+                                    ("Onsdag", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.0116009116784799), ("Onsdag", -1.7047480922384253),
+                                    ("Fredag", -1.2992829841302609)],
+                               n = 3}}),
+       ("ordinal (digits)",
+        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}}),
+       ("quarter (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}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.4816045409242156),
+                                    ("day (grain)intersect", -1.9924301646902063),
+                                    ("weekmonth", -1.4816045409242156),
+                                    ("day (grain)Oktober", -1.9924301646902063),
+                                    ("week (grain)intersect", -1.9924301646902063),
+                                    ("week (grain)September", -1.9924301646902063)],
+                               n = 8},
+                   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 = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)April",
+                                     -1.6094379124341003),
+                                    ("ordinals (first..twentieth,thirtieth,...)Mars",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("ordinal (digits)Mars", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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}}),
+       ("after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.6863989535702288),
+                                    ("intersect", -2.1972245773362196),
+                                    ("tomorrow", -2.1972245773362196), ("day", -2.1972245773362196),
+                                    ("hour", -1.349926716949016)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("lunch", -2.6026896854443837),
+                                    ("year (latent)", -1.9095425048844386),
+                                    ("time-of-day (latent)", -1.9095425048844386),
+                                    ("year", -1.9095425048844386), ("hh:mm", -2.6026896854443837),
+                                    ("hour", -1.6863989535702288), ("minute", -2.6026896854443837)],
+                               n = 8}}),
+       ("day (grain)",
+        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}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Juli", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.9704144655697013),
+                                    ("intersect", -2.5649493574615367),
+                                    ("season", -2.0541237336955462),
+                                    ("next <cycle>", -2.9704144655697013),
+                                    ("day", -2.0541237336955462), ("Oktober", -2.5649493574615367),
+                                    ("hour", -2.277267285009756), ("month", -2.0541237336955462),
+                                    ("week-end", -2.277267285009756)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.3184537311185346, unseen = -4.382026634673881,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Tisdag", -3.676300671907076),
+                                    ("September", -2.760009940032921),
+                                    ("intersect", -1.8845412026790211), ("day", -3.676300671907076),
+                                    ("time-of-day (latent)", -3.270835563798912),
+                                    ("Oktober", -1.971552579668651), ("Mars", -3.270835563798912),
+                                    ("noon", -3.676300671907076), ("hour", -2.760009940032921),
+                                    ("month", -1.0372433422918175),
+                                    ("morning", -3.676300671907076)],
+                               n = 32}}),
+       ("within <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/TR.hs b/Duckling/Ranking/Classifiers/TR.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/TR.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.TR (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/TR_XX.hs b/Duckling/Ranking/Classifiers/TR_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/TR_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.TR_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/UK.hs b/Duckling/Ranking/Classifiers/UK.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/UK.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- 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.UK (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/UK_XX.hs b/Duckling/Ranking/Classifiers/UK_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/UK_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.UK_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/VI.hs b/Duckling/Ranking/Classifiers/VI.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/VI.hs
+++ /dev/null
@@ -1,906 +0,0 @@
--- 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.VI (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> am|pm", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.4986303506721723, unseen = -4.61512051684126,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 99},
-                   koData =
-                     ClassData{prior = -0.9348671174470905, unseen = -4.189654742026425,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 64}}),
-       ("exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day gi\7901", -1.6094379124341003),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i",
-                                     -1.6094379124341003),
-                                    ("time-of-day (latent)", -1.6094379124341003),
-                                    ("hour", -0.916290731874155)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ng\224y h\244m qua",
-        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}}),
-       ("lunch",
-        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}}),
-       ("ng\224y dd/mm",
-        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/mm",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
-       ("<part-of-day> <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.7884573603642702,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -1.128465251817791),
-                                    ("noonh\244m nay", -2.833213344056216),
-                                    ("lunchng\224y mai", -2.4277482359480516),
-                                    ("morningnamed-day", -2.833213344056216),
-                                    ("noonng\224y h\244m qua", -2.4277482359480516),
-                                    ("noonng\224y mai", -2.4277482359480516),
-                                    ("afternoonng\224y dd/mm", -2.833213344056216),
-                                    ("afternoonng\224y mai", -2.833213344056216)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -0.6061358035703156,
-                               unseen = -3.6635616461296463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -1.072636802264849),
-                                    ("afternoon<day-of-month> (numeric with day symbol) <named-month>",
-                                     -2.538973871058276),
-                                    ("afternoongi\225ng sinh", -1.845826690498331),
-                                    ("afternoonng\224y dd/mm/yyyy", -2.9444389791664407),
-                                    ("noongi\225ng sinh", -2.9444389791664407),
-                                    ("afternoonng\224y dd/mm", -2.9444389791664407),
-                                    ("lunchgi\225ng sinh", -2.9444389791664407),
-                                    ("afternoonintersect", -2.9444389791664407)],
-                               n = 12}}),
-       ("tonight",
-        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}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -1.452252328911688, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.2666286632539486,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36}}),
-       ("<day-of-week> t\7899i",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("month (grain)",
-        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}}),
-       ("ng\224y h\244m kia",
-        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}}),
-       ("gi\225ng sinh",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -1.791759469228055, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -0.1823215567939546,
-                               unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.5070449009260846,
-                               unseen = -5.0106352940962555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm",
-                                     -3.6176519448255684),
-                                    ("hourday", -3.6176519448255684),
-                                    ("dayhour", -4.310799125385514),
-                                    ("h\244m nay<time-of-day> s\225ng|chi\7873u|t\7889i",
-                                     -4.310799125385514),
-                                    ("monthyear", -3.3945083935113587),
-                                    ("time-of-day gi\7901<part-of-day> <time>", -4.310799125385514),
-                                    ("time-of-day gi\7901<time> n\224y", -4.310799125385514),
-                                    ("month (numeric with month symbol)year (numeric with year symbol)",
-                                     -3.6176519448255684),
-                                    ("dayday", -2.6060510331470885),
-                                    ("named-monthyear (numeric with year symbol)",
-                                     -4.310799125385514),
-                                    ("hourhour", -3.3945083935113587),
-                                    ("named-day<day-of-month> (numeric with day symbol) <named-month>",
-                                     -2.7013612129514133),
-                                    ("intersectyear (numeric with year symbol)",
-                                     -3.6176519448255684),
-                                    ("dayyear", -2.4389969484839225),
-                                    ("<ordinal> <cycle> of <time>year (numeric with year symbol)",
-                                     -4.310799125385514),
-                                    ("minutehour", -3.9053340172773496),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889iintersect",
-                                     -3.9053340172773496),
-                                    ("time-of-day gi\7901<part-of-day> (h\244m )?nay",
-                                     -4.310799125385514),
-                                    ("<day-of-month> (numeric with day symbol) <named-month>year (numeric with year symbol)",
-                                     -3.2121868367174042),
-                                    ("named-daynext <cycle>", -3.6176519448255684),
-                                    ("named-dayintersect", -4.310799125385514),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i<day-of-month> (numeric with day symbol) <named-month>",
-                                     -3.3945083935113587),
-                                    ("time-of-day gi\7901tonight", -4.310799125385514),
-                                    ("minuteday", -2.8067217286092396),
-                                    ("hh:mm<part-of-day> <time>", -4.310799125385514),
-                                    ("<day-of-month> <named-month>year (numeric with year symbol)",
-                                     -3.2121868367174042),
-                                    ("at hh:mm<part-of-day> <time>", -4.310799125385514),
-                                    ("dayweek", -3.0580361568901457),
-                                    ("weekyear", -4.310799125385514),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm/yyyy",
-                                     -4.310799125385514),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y mai",
-                                     -4.310799125385514),
-                                    ("named-daythis <cycle>", -3.6176519448255684),
-                                    ("seasonthis <cycle>", -4.310799125385514),
-                                    ("minuteyear", -3.9053340172773496)],
-                               n = 53},
-                   koData =
-                     ClassData{prior = -0.9219887529887928, unseen = -4.736198448394496,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm",
-                                     -4.034240638152395),
-                                    ("hourday", -2.2424811689243405),
-                                    ("dayhour", -4.034240638152395),
-                                    ("monthyear", -2.7814776696570274),
-                                    ("noonh\244m nay", -4.034240638152395),
-                                    ("houryear", -4.034240638152395),
-                                    ("month (numeric with month symbol)year (numeric with year symbol)",
-                                     -2.7814776696570274),
-                                    ("dayday", -2.5301632413761213),
-                                    ("dayyear", -4.034240638152395),
-                                    ("h\244m naytime-of-day gi\7901", -4.034240638152395),
-                                    ("minutehour", -3.628775530044231),
-                                    ("<part-of-day> <time>year (numeric with year symbol)",
-                                     -4.034240638152395),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889igi\225ng sinh",
-                                     -2.424802725718295),
-                                    ("noonng\224y h\244m qua", -3.628775530044231),
-                                    ("noongi\225ng sinh", -4.034240638152395),
-                                    ("minuteday", -2.9356283494842854),
-                                    ("hh:mm<part-of-day> <time>", -4.034240638152395),
-                                    ("noonng\224y mai", -3.628775530044231),
-                                    ("<day-of-month> <named-month>year (numeric with year symbol)",
-                                     -4.034240638152395),
-                                    ("named-daygi\225ng sinh", -2.5301632413761213),
-                                    ("at hh:mm<part-of-day> <time>", -4.034240638152395)],
-                               n = 35}}),
-       ("time-of-day gi\7901",
-        Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("exactly <time-of-day>", -3.4657359027997265),
-                                    ("about <time-of-day>", -3.0602707946915624),
-                                    ("time-of-day (latent)", -0.8266785731844679),
-                                    ("hour", -0.7248958788745256)],
-                               n = 30},
-                   koData =
-                     ClassData{prior = -2.772588722239781, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.9808292530117262),
-                                    ("hour", -0.9808292530117262)],
-                               n = 2}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.3862943611198906),
-                                    ("day (grain)ordinalsnamed-month", -2.0794415416798357),
-                                    ("day (grain)ordinalsmonth (numeric with month symbol)",
-                                     -1.6739764335716716),
-                                    ("week (grain)ordinalsintersect", -2.0794415416798357),
-                                    ("weekmonth", -1.6739764335716716),
-                                    ("week (grain)ordinalsmonth (numeric with month symbol)",
-                                     -2.0794415416798357)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("season",
-        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}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.5389965007326869, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -0.8754687373538999,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
-       ("quarter <number>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter (grain)integer (numeric)", -1.2992829841302609),
-                                    ("quarter (grain)integer (0..19)", -1.2992829841302609),
-                                    ("quarter", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter (grain)integer (numeric)", -0.8472978603872037),
-                                    ("quarter", -0.8472978603872037)],
-                               n = 2}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.9459101490553135),
-                                    ("month (grain)", -3.044522437723423),
-                                    ("year (grain)", -2.128231705849268),
-                                    ("week (grain)", -1.9459101490553135),
-                                    ("quarter", -2.3513752571634776), ("year", -2.128231705849268),
-                                    ("month", -3.044522437723423),
-                                    ("quarter (grain)", -2.3513752571634776)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (grain)", -2.639057329615259),
-                                    ("hour (grain)", -2.639057329615259),
-                                    ("year (grain)", -2.639057329615259),
-                                    ("second", -2.3513752571634776), ("day", -2.639057329615259),
-                                    ("minute (grain)", -2.639057329615259),
-                                    ("year", -2.639057329615259),
-                                    ("second (grain)", -2.3513752571634776),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259),
-                                    ("day (grain)", -2.639057329615259)],
-                               n = 13}}),
-       ("ng\224y mai",
-        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}}),
-       ("quarter <number> <year>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -1.0986122886681098),
-                                    ("quarter (grain)integer (numeric)year (numeric with year symbol)",
-                                     -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarterhour", -1.0986122886681098),
-                                    ("quarter (grain)integer (numeric)time-of-day (latent)",
-                                     -1.0986122886681098)],
-                               n = 1}}),
-       ("dd/mm/yyyy",
-        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}}),
-       ("after lunch",
-        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}}),
-       ("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}}),
-       ("<time> tr\432\7899c",
-        Classifier{okData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -1.5040773967762742),
-                                    ("named-day", -1.5040773967762742)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("gi\225ng sinh", -2.2512917986064953),
-                                    ("<hour-of-day> <integer>", -2.2512917986064953),
-                                    ("day", -2.2512917986064953),
-                                    ("time-of-day (latent)", -1.3350010667323402),
-                                    ("hour", -1.3350010667323402), ("minute", -2.2512917986064953)],
-                               n = 6}}),
-       ("ng\224y 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}}),
-       ("<time> n\224y",
-        Classifier{okData =
-                     ClassData{prior = -0.6061358035703156, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("season", -1.845826690498331),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i",
-                                     -2.2512917986064953),
-                                    ("day", -1.845826690498331), ("noon", -1.845826690498331),
-                                    ("hour", -1.3350010667323402),
-                                    ("morning", -2.2512917986064953)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.7884573603642702, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.4469189829363254),
-                                    ("noon", -1.7346010553881064), ("hour", -1.041453874828161)],
-                               n = 5}}),
-       ("b\226y gi\7901",
-        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}}),
-       ("<hour-of-day> <integer>",
-        Classifier{okData =
-                     ClassData{prior = -1.4469189829363254,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7884573603642702),
-                                    ("time-of-day gi\7901integer (numeric)", -0.7884573603642702)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.2682639865946794,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)integer (0..19)", -0.7282385003712154),
-                                    ("hour", -0.7282385003712154)],
-                               n = 13}}),
-       ("<time> t\7899i",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (numeric with month symbol)", -2.2512917986064953),
-                                    ("day", -1.3350010667323402),
-                                    ("named-day", -1.3350010667323402),
-                                    ("month", -2.2512917986064953)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("gi\225ng sinh", -2.0149030205422647),
-                                    ("time-of-day gi\7901", -2.0149030205422647),
-                                    ("<hour-of-day> <integer>", -2.0149030205422647),
-                                    ("day", -2.0149030205422647), ("hour", -2.0149030205422647),
-                                    ("minute", -2.0149030205422647)],
-                               n = 3}}),
-       ("<time-of-day> s\225ng|chi\7873u|t\7889i",
-        Classifier{okData =
-                     ClassData{prior = -5.129329438755058e-2,
-                               unseen = -4.465908118654584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("exactly <time-of-day>", -3.7612001156935624),
-                                    ("time-of-day gi\7901", -1.318853080324358),
-                                    ("<hour-of-day> <integer>", -3.355735007585398),
-                                    ("about <time-of-day>", -3.355735007585398),
-                                    ("at hh:mm", -3.068052935133617),
-                                    ("(hour-of-day) half", -3.355735007585398),
-                                    ("hh:mm", -2.5084371471981943), ("hour", -1.1962507582320256),
-                                    ("minute", -1.8152899666382492)],
-                               n = 38},
-                   koData =
-                     ClassData{prior = -2.995732273553991, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.540445040947149),
-                                    ("hour", -1.540445040947149)],
-                               n = 2}}),
-       ("named-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}}),
-       ("month (numeric with month symbol)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.2231435513142097),
-                                    ("integer (0..19)", -1.6094379124341003)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        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}}),
-       ("year (numeric with year symbol)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter <number> of <year>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -1.0986122886681098),
-                                    ("quarter (grain)integer (numeric)year (numeric with year symbol)",
-                                     -1.0986122886681098)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarterhour", -1.0986122886681098),
-                                    ("quarter (grain)integer (numeric)time-of-day (latent)",
-                                     -1.0986122886681098)],
-                               n = 1}}),
-       ("afternoon",
-        Classifier{okData =
-                     ClassData{prior = -0.916290731874155, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.5108256237659907,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.6109179126442243,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.6376087894007967),
-                                    ("year (grain)", -2.1972245773362196),
-                                    ("week (grain)", -1.6376087894007967),
-                                    ("day", -2.890371757896165), ("quarter", -1.9740810260220096),
-                                    ("year", -2.1972245773362196),
-                                    ("quarter (grain)", -1.9740810260220096),
-                                    ("day (grain)", -2.890371757896165)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        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}}),
-       ("about <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day gi\7901", -1.6739764335716716),
-                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i",
-                                     -1.6739764335716716),
-                                    ("time-of-day (latent)", -1.6739764335716716),
-                                    ("hour", -0.8266785731844679)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.6567795363890705,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.10536051565782628),
-                                    ("integer (0..19)", -2.3025850929940455)],
-                               n = 28},
-                   koData =
-                     ClassData{prior = -0.7308875085427924, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.4989911661189879),
-                                    ("integer (0..19)", -0.9343092373768334)],
-                               n = 26}}),
-       ("at hh:mm",
-        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}}),
-       ("(hour-of-day) half",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day gi\7901", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -5.225746673713201,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.42859635585027),
-                                    ("integer (0..19)year (grain)", -4.527208644518379),
-                                    ("integer (numeric)day (grain)", -3.0231312477421053),
-                                    ("integer (0..19)hour (grain)", -3.834061463958434),
-                                    ("second", -3.6109179126442243),
-                                    ("integer (numeric)second (grain)", -3.6109179126442243),
-                                    ("integer (numeric)year (grain)", -2.655406467616788),
-                                    ("day", -2.822460552279954), ("year", -2.581298495463066),
-                                    ("integer (numeric)week (grain)", -4.121743536410215),
-                                    ("integer (0..19)month (grain)", -4.527208644518379),
-                                    ("hour", -2.001480000210124), ("month", -2.042301994730379),
-                                    ("integer (numeric)minute (grain)", -3.6109179126442243),
-                                    ("integer (numeric)month (grain)", -2.084861609149175),
-                                    ("minute", -3.6109179126442243),
-                                    ("integer (numeric)hour (grain)", -2.129313371720009),
-                                    ("integer (0..19)day (grain)", -4.121743536410215),
-                                    ("integer (0..19)week (grain)", -3.834061463958434)],
-                               n = 83}}),
-       ("<time-of-day> am|pm",
-        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}}),
-       ("h\244m nay",
-        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}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 29},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        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}}),
-       ("intersect by \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynext <cycle>", -1.5040773967762742),
-                                    ("dayweek", -0.8109302162163288),
-                                    ("named-daythis <cycle>", -1.0986122886681098)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer> ph\250t",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("time-of-day gi\7901integer (numeric)", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("noon",
-        Classifier{okData =
-                     ClassData{prior = -0.7621400520468967,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -0.6286086594223742,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
-       ("ordinals",
-        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}}),
-       ("(hour-of-day) quarter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("time-of-day gi\7901integer (numeric)", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.7731898882334817, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.5649493574615367),
-                                    ("month (grain)", -2.5649493574615367),
-                                    ("year (grain)", -1.6486586255873816),
-                                    ("week (grain)", -2.5649493574615367),
-                                    ("year", -1.6486586255873816), ("month", -2.5649493574615367)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.6190392084062235, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (grain)", -2.2335922215070942),
-                                    ("hour (grain)", -2.639057329615259),
-                                    ("year (grain)", -2.639057329615259),
-                                    ("second", -2.639057329615259), ("day", -2.639057329615259),
-                                    ("minute (grain)", -2.639057329615259),
-                                    ("year", -2.639057329615259),
-                                    ("second (grain)", -2.639057329615259),
-                                    ("hour", -2.639057329615259), ("month", -2.2335922215070942),
-                                    ("minute", -2.639057329615259),
-                                    ("day (grain)", -2.639057329615259)],
-                               n = 7}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.1431008436406733,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)day (grain)", -2.639057329615259),
-                                    ("second", -2.3513752571634776),
-                                    ("integer (numeric)second (grain)", -2.3513752571634776),
-                                    ("integer (numeric)year (grain)", -2.639057329615259),
-                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
-                                    ("integer (0..19)month (grain)", -3.044522437723423),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("integer (numeric)minute (grain)", -2.639057329615259),
-                                    ("integer (numeric)month (grain)", -3.044522437723423),
-                                    ("minute", -2.639057329615259),
-                                    ("integer (numeric)hour (grain)", -2.639057329615259)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -2.0149030205422647, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.8971199848858813),
-                                    ("integer (numeric)week (grain)", -2.3025850929940455),
-                                    ("integer (0..19)week (grain)", -2.3025850929940455)],
-                               n = 2}}),
-       ("<day-of-month> <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.10008345855698253,
-                               unseen = -3.7376696182833684,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)month (numeric with month symbol)",
-                                     -0.8232003088081431),
-                                    ("integer (numeric)named-month", -2.6149597780361984),
-                                    ("month", -0.7178397931503169)],
-                               n = 19},
-                   koData =
-                     ClassData{prior = -2.3513752571634776,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)month (numeric with month symbol)",
-                                     -0.8472978603872037),
-                                    ("month", -0.8472978603872037)],
-                               n = 2}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)day (grain)", -2.3353749158170367),
-                                    ("integer (0..19)hour (grain)", -2.740840023925201),
-                                    ("second", -2.740840023925201),
-                                    ("integer (numeric)second (grain)", -2.740840023925201),
-                                    ("integer (numeric)year (grain)", -2.740840023925201),
-                                    ("day", -2.3353749158170367), ("year", -2.740840023925201),
-                                    ("hour", -2.3353749158170367), ("month", -2.3353749158170367),
-                                    ("integer (numeric)minute (grain)", -2.740840023925201),
-                                    ("integer (numeric)month (grain)", -2.3353749158170367),
-                                    ("minute", -2.740840023925201),
-                                    ("integer (numeric)hour (grain)", -2.740840023925201)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter (grain)",
-        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}}),
-       ("morning",
-        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 (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.6190392084062235,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -0.7731898882334817,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("<part-of-day> (h\244m )?nay",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon", -1.0116009116784799), ("hour", -0.7884573603642702),
-                                    ("morning", -1.7047480922384253)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (numeric with day symbol) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)month (numeric with month symbol)",
-                                     -0.8167611365271219),
-                                    ("integer (numeric)named-month", -2.662587827025453),
-                                    ("month", -0.7166776779701395)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/VI_XX.hs b/Duckling/Ranking/Classifiers/VI_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/VI_XX.hs
@@ -0,0 +1,969 @@
+-- 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.VI_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.4986303506721723, unseen = -4.61512051684126,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 99},
+                   koData =
+                     ClassData{prior = -0.9348671174470905, unseen = -4.189654742026425,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 64}}),
+       ("exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day gi\7901", -1.6094379124341003),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i",
+                                     -1.6094379124341003),
+                                    ("time-of-day (latent)", -1.6094379124341003),
+                                    ("hour", -0.916290731874155)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ng\224y h\244m qua",
+        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}}),
+       ("lunch",
+        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}}),
+       ("ng\224y dd/mm",
+        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/mm",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("<part-of-day> <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.7884573603642702,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -1.128465251817791),
+                                    ("noonh\244m nay", -2.833213344056216),
+                                    ("lunchng\224y mai", -2.4277482359480516),
+                                    ("noonng\224y h\244m qua", -2.4277482359480516),
+                                    ("morningSunday", -2.833213344056216),
+                                    ("noonng\224y mai", -2.4277482359480516),
+                                    ("afternoonng\224y dd/mm", -2.833213344056216),
+                                    ("afternoonng\224y mai", -2.833213344056216)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.6061358035703156,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -1.072636802264849),
+                                    ("afternoon<day-of-month> (numeric with day symbol) <named-month>",
+                                     -2.538973871058276),
+                                    ("afternoongi\225ng sinh", -1.845826690498331),
+                                    ("afternoonng\224y dd/mm/yyyy", -2.9444389791664407),
+                                    ("noongi\225ng sinh", -2.9444389791664407),
+                                    ("afternoonng\224y dd/mm", -2.9444389791664407),
+                                    ("lunchgi\225ng sinh", -2.9444389791664407),
+                                    ("afternoonintersect", -2.9444389791664407)],
+                               n = 12}}),
+       ("tonight",
+        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}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -1.452252328911688, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.2666286632539486,
+                               unseen = -3.6375861597263857,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 36}}),
+       ("<day-of-week> t\7899i",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -1.3862943611198906), ("Friday", -1.791759469228055),
+                                    ("day", -0.8754687373538999), ("Tuesday", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("October",
+        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 (grain)",
+        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}}),
+       ("Wednesday",
+        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}}),
+       ("ng\224y h\244m kia",
+        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}}),
+       ("gi\225ng sinh",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.5070449009260846, unseen = -5.049856007249537,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm",
+                                     -3.657130755799356),
+                                    ("hourday", -3.657130755799356),
+                                    ("dayhour", -4.350277936359301),
+                                    ("h\244m nay<time-of-day> s\225ng|chi\7873u|t\7889i",
+                                     -4.350277936359301),
+                                    ("monthyear", -3.4339872044851463),
+                                    ("Wednesdaynext <cycle>", -4.350277936359301),
+                                    ("Tuesday<day-of-month> (numeric with day symbol) <named-month>",
+                                     -4.350277936359301),
+                                    ("time-of-day gi\7901<part-of-day> <time>", -4.350277936359301),
+                                    ("Sunday<day-of-month> (numeric with day symbol) <named-month>",
+                                     -3.9448128282511368),
+                                    ("time-of-day gi\7901<time> n\224y", -4.350277936359301),
+                                    ("month (numeric with month symbol)year (numeric with year symbol)",
+                                     -3.657130755799356),
+                                    ("dayday", -2.645529844120876),
+                                    ("hourhour", -3.4339872044851463),
+                                    ("intersectyear (numeric with year symbol)",
+                                     -3.657130755799356),
+                                    ("dayyear", -2.4784757594577096),
+                                    ("<ordinal> <cycle> of <time>year (numeric with year symbol)",
+                                     -4.350277936359301),
+                                    ("minutehour", -3.9448128282511368),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889iintersect",
+                                     -3.9448128282511368),
+                                    ("Thursdaynext <cycle>", -3.9448128282511368),
+                                    ("Octoberyear (numeric with year symbol)", -4.350277936359301),
+                                    ("time-of-day gi\7901<part-of-day> (h\244m )?nay",
+                                     -4.350277936359301),
+                                    ("<day-of-month> (numeric with day symbol) <named-month>year (numeric with year symbol)",
+                                     -3.2516656476911914),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i<day-of-month> (numeric with day symbol) <named-month>",
+                                     -3.4339872044851463),
+                                    ("time-of-day gi\7901tonight", -4.350277936359301),
+                                    ("minuteday", -2.846200539583027),
+                                    ("hh:mm<part-of-day> <time>", -4.350277936359301),
+                                    ("<day-of-month> <named-month>year (numeric with year symbol)",
+                                     -3.2516656476911914),
+                                    ("Fridaythis <cycle>", -3.9448128282511368),
+                                    ("Thursdaythis <cycle>", -4.350277936359301),
+                                    ("at hh:mm<part-of-day> <time>", -4.350277936359301),
+                                    ("dayweek", -3.0975149678639333),
+                                    ("weekyear", -4.350277936359301),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm/yyyy",
+                                     -4.350277936359301),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y mai",
+                                     -4.350277936359301),
+                                    ("Tuesdayintersect", -4.350277936359301),
+                                    ("Monday<day-of-month> (numeric with day symbol) <named-month>",
+                                     -3.0975149678639333),
+                                    ("seasonthis <cycle>", -4.350277936359301),
+                                    ("minuteyear", -3.9448128282511368)],
+                               n = 53},
+                   koData =
+                     ClassData{prior = -0.9219887529887928, unseen = -4.787491742782046,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> s\225ng|chi\7873u|t\7889ing\224y dd/mm",
+                                     -4.085976312551584),
+                                    ("hourday", -2.2942168433235293),
+                                    ("dayhour", -4.085976312551584),
+                                    ("monthyear", -2.833213344056216),
+                                    ("noonh\244m nay", -4.085976312551584),
+                                    ("houryear", -4.085976312551584),
+                                    ("Mondaygi\225ng sinh", -2.987364023883474),
+                                    ("month (numeric with month symbol)year (numeric with year symbol)",
+                                     -2.833213344056216),
+                                    ("dayday", -2.58189891577531), ("dayyear", -4.085976312551584),
+                                    ("h\244m naytime-of-day gi\7901", -4.085976312551584),
+                                    ("minutehour", -3.6805112044434196),
+                                    ("Sundaygi\225ng sinh", -3.6805112044434196),
+                                    ("<part-of-day> <time>year (numeric with year symbol)",
+                                     -4.085976312551584),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889igi\225ng sinh",
+                                     -2.4765384001174837),
+                                    ("noonng\224y h\244m qua", -3.6805112044434196),
+                                    ("noongi\225ng sinh", -4.085976312551584),
+                                    ("minuteday", -2.987364023883474),
+                                    ("hh:mm<part-of-day> <time>", -4.085976312551584),
+                                    ("noonng\224y mai", -3.6805112044434196),
+                                    ("<day-of-month> <named-month>year (numeric with year symbol)",
+                                     -4.085976312551584),
+                                    ("at hh:mm<part-of-day> <time>", -4.085976312551584),
+                                    ("Tuesdaygi\225ng sinh", -4.085976312551584)],
+                               n = 35}}),
+       ("time-of-day gi\7901",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("exactly <time-of-day>", -3.4657359027997265),
+                                    ("about <time-of-day>", -3.0602707946915624),
+                                    ("time-of-day (latent)", -0.8266785731844679),
+                                    ("hour", -0.7248958788745256)],
+                               n = 30},
+                   koData =
+                     ClassData{prior = -2.772588722239781, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.9808292530117262),
+                                    ("hour", -0.9808292530117262)],
+                               n = 2}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("day (grain)ordinalsmonth (numeric with month symbol)",
+                                     -1.6739764335716716),
+                                    ("week (grain)ordinalsintersect", -2.0794415416798357),
+                                    ("day (grain)ordinalsMarch", -2.0794415416798357),
+                                    ("weekmonth", -1.6739764335716716),
+                                    ("week (grain)ordinalsmonth (numeric with month symbol)",
+                                     -2.0794415416798357)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("season",
+        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}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.5389965007326869, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -0.8754687373538999,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10}}),
+       ("quarter <number>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter (grain)integer (numeric)", -1.2992829841302609),
+                                    ("quarter (grain)integer (0..19)", -1.2992829841302609),
+                                    ("quarter", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter (grain)integer (numeric)", -0.8472978603872037),
+                                    ("quarter", -0.8472978603872037)],
+                               n = 2}}),
+       ("next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.9459101490553135),
+                                    ("month (grain)", -3.044522437723423),
+                                    ("year (grain)", -2.128231705849268),
+                                    ("week (grain)", -1.9459101490553135),
+                                    ("quarter", -2.3513752571634776), ("year", -2.128231705849268),
+                                    ("month", -3.044522437723423),
+                                    ("quarter (grain)", -2.3513752571634776)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month (grain)", -2.639057329615259),
+                                    ("hour (grain)", -2.639057329615259),
+                                    ("year (grain)", -2.639057329615259),
+                                    ("second", -2.3513752571634776), ("day", -2.639057329615259),
+                                    ("minute (grain)", -2.639057329615259),
+                                    ("year", -2.639057329615259),
+                                    ("second (grain)", -2.3513752571634776),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259),
+                                    ("day (grain)", -2.639057329615259)],
+                               n = 13}}),
+       ("ng\224y mai",
+        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}}),
+       ("quarter <number> <year>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarteryear", -1.0986122886681098),
+                                    ("quarter (grain)integer (numeric)year (numeric with year symbol)",
+                                     -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarterhour", -1.0986122886681098),
+                                    ("quarter (grain)integer (numeric)time-of-day (latent)",
+                                     -1.0986122886681098)],
+                               n = 1}}),
+       ("Monday",
+        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}}),
+       ("dd/mm/yyyy",
+        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}}),
+       ("after lunch",
+        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}}),
+       ("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}}),
+       ("<time> tr\432\7899c",
+        Classifier{okData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.5040773967762742), ("Tuesday", -1.5040773967762742)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("gi\225ng sinh", -2.2512917986064953),
+                                    ("<hour-of-day> <integer>", -2.2512917986064953),
+                                    ("day", -2.2512917986064953),
+                                    ("time-of-day (latent)", -1.3350010667323402),
+                                    ("hour", -1.3350010667323402), ("minute", -2.2512917986064953)],
+                               n = 6}}),
+       ("ng\224y 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}}),
+       ("<time> n\224y",
+        Classifier{okData =
+                     ClassData{prior = -0.6061358035703156, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("season", -1.845826690498331),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i",
+                                     -2.2512917986064953),
+                                    ("day", -1.845826690498331), ("noon", -1.845826690498331),
+                                    ("hour", -1.3350010667323402),
+                                    ("morning", -2.2512917986064953)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.7884573603642702, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.4469189829363254),
+                                    ("noon", -1.7346010553881064), ("hour", -1.041453874828161)],
+                               n = 5}}),
+       ("b\226y gi\7901",
+        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}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -1.4469189829363254,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7884573603642702),
+                                    ("time-of-day gi\7901integer (numeric)", -0.7884573603642702)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.2682639865946794,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)integer (0..19)", -0.7282385003712154),
+                                    ("hour", -0.7282385003712154)],
+                               n = 13}}),
+       ("<time> t\7899i",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -1.9459101490553135),
+                                    ("month (numeric with month symbol)", -2.3513752571634776),
+                                    ("Friday", -2.3513752571634776), ("day", -1.4350845252893227),
+                                    ("month", -2.3513752571634776),
+                                    ("Tuesday", -2.3513752571634776)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("gi\225ng sinh", -2.1400661634962708),
+                                    ("time-of-day gi\7901", -2.1400661634962708),
+                                    ("<hour-of-day> <integer>", -2.1400661634962708),
+                                    ("day", -2.1400661634962708), ("hour", -2.1400661634962708),
+                                    ("minute", -2.1400661634962708)],
+                               n = 3}}),
+       ("<time-of-day> s\225ng|chi\7873u|t\7889i",
+        Classifier{okData =
+                     ClassData{prior = -5.129329438755058e-2,
+                               unseen = -4.465908118654584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("exactly <time-of-day>", -3.7612001156935624),
+                                    ("time-of-day gi\7901", -1.318853080324358),
+                                    ("<hour-of-day> <integer>", -3.355735007585398),
+                                    ("about <time-of-day>", -3.355735007585398),
+                                    ("at hh:mm", -3.068052935133617),
+                                    ("(hour-of-day) half", -3.355735007585398),
+                                    ("hh:mm", -2.5084371471981943), ("hour", -1.1962507582320256),
+                                    ("minute", -1.8152899666382492)],
+                               n = 38},
+                   koData =
+                     ClassData{prior = -2.995732273553991, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.540445040947149),
+                                    ("hour", -1.540445040947149)],
+                               n = 2}}),
+       ("April",
+        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 (numeric with month symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.2231435513142097),
+                                    ("integer (0..19)", -1.6094379124341003)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        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}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("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}}),
+       ("quarter <number> of <year>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarteryear", -1.0986122886681098),
+                                    ("quarter (grain)integer (numeric)year (numeric with year symbol)",
+                                     -1.0986122886681098)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarterhour", -1.0986122886681098),
+                                    ("quarter (grain)integer (numeric)time-of-day (latent)",
+                                     -1.0986122886681098)],
+                               n = 1}}),
+       ("Sunday",
+        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}}),
+       ("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.916290731874155, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.5108256237659907,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.6376087894007967),
+                                    ("year (grain)", -2.1972245773362196),
+                                    ("week (grain)", -1.6376087894007967),
+                                    ("day", -2.890371757896165), ("quarter", -1.9740810260220096),
+                                    ("year", -2.1972245773362196),
+                                    ("quarter (grain)", -1.9740810260220096),
+                                    ("day (grain)", -2.890371757896165)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        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}}),
+       ("about <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day gi\7901", -1.6739764335716716),
+                                    ("<time-of-day> s\225ng|chi\7873u|t\7889i",
+                                     -1.6739764335716716),
+                                    ("time-of-day (latent)", -1.6739764335716716),
+                                    ("hour", -0.8266785731844679)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.6567795363890705,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.10536051565782628),
+                                    ("integer (0..19)", -2.3025850929940455)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -0.7308875085427924, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.4989911661189879),
+                                    ("integer (0..19)", -0.9343092373768334)],
+                               n = 26}}),
+       ("at hh:mm",
+        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}}),
+       ("(hour-of-day) half",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day gi\7901", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -5.225746673713201,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.42859635585027),
+                                    ("integer (0..19)year (grain)", -4.527208644518379),
+                                    ("integer (numeric)day (grain)", -3.0231312477421053),
+                                    ("integer (0..19)hour (grain)", -3.834061463958434),
+                                    ("second", -3.6109179126442243),
+                                    ("integer (numeric)second (grain)", -3.6109179126442243),
+                                    ("integer (numeric)year (grain)", -2.655406467616788),
+                                    ("day", -2.822460552279954), ("year", -2.581298495463066),
+                                    ("integer (numeric)week (grain)", -4.121743536410215),
+                                    ("integer (0..19)month (grain)", -4.527208644518379),
+                                    ("hour", -2.001480000210124), ("month", -2.042301994730379),
+                                    ("integer (numeric)minute (grain)", -3.6109179126442243),
+                                    ("integer (numeric)month (grain)", -2.084861609149175),
+                                    ("minute", -3.6109179126442243),
+                                    ("integer (numeric)hour (grain)", -2.129313371720009),
+                                    ("integer (0..19)day (grain)", -4.121743536410215),
+                                    ("integer (0..19)week (grain)", -3.834061463958434)],
+                               n = 83}}),
+       ("<time-of-day> am|pm",
+        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}}),
+       ("h\244m nay",
+        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}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("second (grain)",
+        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}}),
+       ("intersect by \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesdaynext <cycle>", -1.6094379124341003),
+                                    ("Fridaythis <cycle>", -1.6094379124341003),
+                                    ("Thursdaythis <cycle>", -1.6094379124341003),
+                                    ("dayweek", -0.916290731874155)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer> ph\250t",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("time-of-day gi\7901integer (numeric)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("March",
+        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}}),
+       ("noon",
+        Classifier{okData =
+                     ClassData{prior = -0.7621400520468967,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.6286086594223742,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("ordinals",
+        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}}),
+       ("(hour-of-day) quarter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("time-of-day gi\7901integer (numeric)", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.7731898882334817, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5649493574615367),
+                                    ("month (grain)", -2.5649493574615367),
+                                    ("year (grain)", -1.6486586255873816),
+                                    ("week (grain)", -2.5649493574615367),
+                                    ("year", -1.6486586255873816), ("month", -2.5649493574615367)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.6190392084062235, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("month (grain)", -2.2335922215070942),
+                                    ("hour (grain)", -2.639057329615259),
+                                    ("year (grain)", -2.639057329615259),
+                                    ("second", -2.639057329615259), ("day", -2.639057329615259),
+                                    ("minute (grain)", -2.639057329615259),
+                                    ("year", -2.639057329615259),
+                                    ("second (grain)", -2.639057329615259),
+                                    ("hour", -2.639057329615259), ("month", -2.2335922215070942),
+                                    ("minute", -2.639057329615259),
+                                    ("day (grain)", -2.639057329615259)],
+                               n = 7}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.1431008436406733,
+                               unseen = -3.7612001156935624,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)day (grain)", -2.639057329615259),
+                                    ("second", -2.3513752571634776),
+                                    ("integer (numeric)second (grain)", -2.3513752571634776),
+                                    ("integer (numeric)year (grain)", -2.639057329615259),
+                                    ("day", -2.639057329615259), ("year", -2.639057329615259),
+                                    ("integer (0..19)month (grain)", -3.044522437723423),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("integer (numeric)minute (grain)", -2.639057329615259),
+                                    ("integer (numeric)month (grain)", -3.044522437723423),
+                                    ("minute", -2.639057329615259),
+                                    ("integer (numeric)hour (grain)", -2.639057329615259)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -2.0149030205422647, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.8971199848858813),
+                                    ("integer (numeric)week (grain)", -2.3025850929940455),
+                                    ("integer (0..19)week (grain)", -2.3025850929940455)],
+                               n = 2}}),
+       ("<day-of-month> <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.10008345855698253,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)month (numeric with month symbol)",
+                                     -0.8232003088081431),
+                                    ("month", -0.7178397931503169),
+                                    ("integer (numeric)March", -2.6149597780361984)],
+                               n = 19},
+                   koData =
+                     ClassData{prior = -2.3513752571634776,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)month (numeric with month symbol)",
+                                     -0.8472978603872037),
+                                    ("month", -0.8472978603872037)],
+                               n = 2}}),
+       ("Tuesday",
+        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}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)day (grain)", -2.3353749158170367),
+                                    ("integer (0..19)hour (grain)", -2.740840023925201),
+                                    ("second", -2.740840023925201),
+                                    ("integer (numeric)second (grain)", -2.740840023925201),
+                                    ("integer (numeric)year (grain)", -2.740840023925201),
+                                    ("day", -2.3353749158170367), ("year", -2.740840023925201),
+                                    ("hour", -2.3353749158170367), ("month", -2.3353749158170367),
+                                    ("integer (numeric)minute (grain)", -2.740840023925201),
+                                    ("integer (numeric)month (grain)", -2.3353749158170367),
+                                    ("minute", -2.740840023925201),
+                                    ("integer (numeric)hour (grain)", -2.740840023925201)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        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}}),
+       ("morning",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.6190392084062235,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.7731898882334817,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("<part-of-day> (h\244m )?nay",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon", -1.0116009116784799), ("hour", -0.7884573603642702),
+                                    ("morning", -1.7047480922384253)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (numeric with day symbol) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)month (numeric with month symbol)",
+                                     -0.8167611365271219),
+                                    ("month", -0.7166776779701395),
+                                    ("integer (numeric)March", -2.662587827025453)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/ZH.hs b/Duckling/Ranking/Classifiers/ZH.hs
deleted file mode 100644
--- a/Duckling/Ranking/Classifiers/ZH.hs
+++ /dev/null
@@ -1,827 +0,0 @@
--- 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.ZH (classifiers) where
-import Prelude
-import Duckling.Ranking.Types
-import qualified Data.HashMap.Strict as HashMap
-import Data.String
-
-classifiers :: Classifiers
-classifiers
-  = HashMap.fromList
-      [("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time-of-day> am|pm", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.5020919437972361, unseen = -3.871201010907891,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 46},
-                   koData =
-                     ClassData{prior = -0.9295359586241757,
-                               unseen = -3.4657359027997265,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
-       ("the day before yesterday",
-        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}}),
-       ("today",
-        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",
-        Classifier{okData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               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}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -0.4700036292457356,
-                               unseen = -3.7376696182833684,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.0296194171811581,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 5}}),
-       ("national 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}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.4367176516122688, unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -3.506557897319982),
-                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.5606477482646683),
-                                    ("dayday", -1.8971199848858813),
-                                    ("hourhour", -2.995732273553991),
-                                    ("hourminute", -3.506557897319982),
-                                    ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.8971199848858813),
-                                    ("dayminute", -3.506557897319982),
-                                    ("tonight<time-of-day> o'clock", -2.995732273553991),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.506557897319982),
-                                    ("yearday", -1.5606477482646683)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -1.0388930539664873, unseen = -4.143134726391533,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -2.181224235989778),
-                                    ("dayhour", -2.517696472610991),
-                                    ("daymonth", -2.0476928433652555),
-                                    ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.028522096376982),
-                                    ("year (numeric with year symbol)named-month",
-                                     -2.181224235989778),
-                                    ("hourhour", -3.028522096376982),
-                                    ("hourminute", -3.028522096376982),
-                                    ("absorption of , after named daynamed-month",
-                                     -2.0476928433652555),
-                                    ("yearmonth", -2.181224235989778),
-                                    ("dayminute", -3.028522096376982),
-                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.028522096376982)],
-                               n = 23}}),
-       ("year (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}}),
-       ("last tuesday, last july",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8690378470236094),
-                                    ("named-day", -0.8690378470236094)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.1588830833596715,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0076405104623831),
-                                    ("named-month", -3.4499875458315876),
-                                    ("month (numeric with month symbol)", -2.3513752571634776),
-                                    ("hour", -1.0076405104623831), ("month", -2.1972245773362196)],
-                               n = 28}}),
-       ("next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.7472144018302211,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("month (grain)", -1.791759469228055),
-                                    ("year (grain)", -2.4849066497880004),
-                                    ("week (grain)", -1.3862943611198906),
-                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6418538861723948, unseen = -3.295836866004329,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.8602012652231115),
-                                    ("week (grain)", -0.8602012652231115)],
-                               n = 10}}),
-       ("last 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}}),
-       ("this <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.8066624897703196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               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}}),
-       ("mm/dd/yyyy",
-        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}}),
-       ("evening|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}}),
-       ("yesterday",
-        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}}),
-       ("next 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}}),
-       ("hh:mm (time-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}}),
-       ("<integer> (latent time-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -1.3217558399823195,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.2809338454620642),
-                                    ("integer (0..10)", -0.325422400434628)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -0.3101549283038396,
-                               unseen = -3.8501476017100584,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -2.2192034840549946),
-                                    ("integer (0..10)", -0.11506932978478723)],
-                               n = 44}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("monthday", -0.7472144018302211),
-                                    ("month (numeric with month symbol)ordinal (digits)named-day",
-                                     -1.3350010667323402),
-                                    ("named-monthordinal (digits)named-day", -1.3350010667323402)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("named-month",
-        Classifier{okData =
-                     ClassData{prior = -3.7740327982847086e-2,
-                               unseen = -3.332204510175204,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
-                   koData =
-                     ClassData{prior = -3.295836866004329, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("month (numeric with month symbol)",
-        Classifier{okData =
-                     ClassData{prior = -0.13976194237515874,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.0296194171811581),
-                                    ("integer (0..10)", -0.4418327522790392)],
-                               n = 40},
-                   koData =
-                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
-                               n = 6}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.8434293836092833,
-                               unseen = -3.6635616461296463,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
-                   koData =
-                     ClassData{prior = -0.5625269981428811,
-                               unseen = -3.9318256327243257,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
-       ("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}}),
-       ("year (numeric with year symbol)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        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}}),
-       ("numbers prefix with -, negative or minus",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 4}}),
-       ("tomorrow",
-        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 year",
-        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.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> from now",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
-                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
-                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
-                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
-                                    ("minute", -2.772588722239781)],
-                               n = 20}}),
-       ("this <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -1.0185695809945732,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.916290731874155),
-                                    ("year (grain)", -2.3025850929940455),
-                                    ("week (grain)", -0.916290731874155),
-                                    ("year", -2.3025850929940455)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -0.4480247225269604,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.7339691750802004),
-                                    ("week (grain)", -0.7339691750802004)],
-                               n = 23}}),
-       ("minute (grain)",
-        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}}),
-       ("<dim time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -0.7514160886839211),
-                                    ("national dayevening|night", -2.871679624884012),
-                                    ("<named-month> <day-of-month>morning", -1.405342556090585),
-                                    ("named-daymorning", -1.7730673362159024),
-                                    ("children's dayafternoon", -2.871679624884012)],
-                               n = 24},
-                   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,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
-                                    ("hourhour", -1.1631508098056809),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -2.0794415416798357),
-                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
-                                    ("hourminute", -1.9252908618525775),
-                                    ("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},
-                   koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourhour", -1.2039728043259361),
-                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.8971199848858813),
-                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
-                                    ("hourminute", -1.8971199848858813),
-                                    ("afternoon<integer> (latent time-of-day)",
-                                     -1.742969305058623)],
-                               n = 16}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -5.877735781779639,
-                               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}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mm (time-of-day)", -1.252762968495368),
-                                    ("<integer> (latent time-of-day)", -1.540445040947149),
-                                    ("hour", -1.540445040947149), ("minute", -1.252762968495368)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 3}}),
-       ("relative minutes after|past <integer> (hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (11..19)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (0..10)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5}}),
-       ("army'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}}),
-       ("intersect by \",\"",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.7576857016975165),
-                                    ("named-day<named-month> <day-of-month>", -0.7576857016975165)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("named-daynamed-month", -0.8109302162163288),
-                                    ("daymonth", -0.8109302162163288)],
-                               n = 7}}),
-       ("named-day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.605170185988091,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 98},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain)",
-        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}}),
-       ("<duration> ago",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.891820298110627,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
-                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
-                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
-                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
-                                    ("minute", -2.772588722239781)],
-                               n = 20}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8690378470236094),
-                                    ("named-day", -0.8690378470236094)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.1588830833596715,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0076405104623831),
-                                    ("named-month", -3.4499875458315876),
-                                    ("month (numeric with month symbol)", -2.3513752571634776),
-                                    ("hour", -1.0076405104623831), ("month", -2.1972245773362196)],
-                               n = 28}}),
-       ("the day after tomorrow",
-        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}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.5260563034950494, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9808292530117262),
-                                    ("named-day", -0.9808292530117262)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.24512245803298496,
-                               unseen = -3.7612001156935624,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.1727202608218315),
-                                    ("month (numeric with month symbol)", -3.044522437723423),
-                                    ("day", -1.9459101490553135),
-                                    ("named-day", -1.9459101490553135),
-                                    ("hour", -1.1727202608218315), ("month", -3.044522437723423)],
-                               n = 18}}),
-       ("last <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.8472978603872037,
-                               unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.3862943611198906),
-                                    ("month (grain)", -1.791759469228055),
-                                    ("year (grain)", -2.4849066497880004),
-                                    ("week (grain)", -1.3862943611198906),
-                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.5596157879354228,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -0.8362480242006186),
-                                    ("week (grain)", -0.8362480242006186)],
-                               n = 12}}),
-       ("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.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("next n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.59511985013459,
-                               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)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("children'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}}),
-       ("<named-month> <day-of-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.820281565605037,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("month (numeric with month symbol)integer (11..19)",
-                                     -2.6149597780361984),
-                                    ("named-monthinteger (11..19)", -2.6149597780361984),
-                                    ("named-monthinteger (numeric)", -3.713572066704308),
-                                    ("month (numeric with month symbol)integer (numeric)",
-                                     -2.1041341542702074),
-                                    ("month", -0.734646911466698),
-                                    ("month (numeric with month symbol)integer (0..10)",
-                                     -2.1041341542702074),
-                                    ("named-monthinteger (0..10)", -2.2472349979108808)],
-                               n = 58},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (0..10)",
-        Classifier{okData =
-                     ClassData{prior = -0.44306352166517193,
-                               unseen = -5.170483995038151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
-                   koData =
-                     ClassData{prior = -1.0274078423763182, unseen = -4.59511985013459,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 97}}),
-       ("last n <cycle>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
-                               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},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = -0.17185025692665928,
-                               unseen = -3.5553480614894135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 16},
-                   koData =
-                     ClassData{prior = -1.845826690498331, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.6931471805599453),
-                                    ("named-day", -0.6931471805599453)],
-                               n = 3}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("n <cycle> last",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
-                               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)],
-                               n = 20},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("morning",
-        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}}),
-       ("week-end",
-        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 (grain)",
-        Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               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}}),
-       ("labor 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}}),
-       ("women'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}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.2318016140573243, unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.8407831793660099),
-                                    ("named-day", -0.8407831793660099),
-                                    ("hour", -2.833213344056216), ("week-end", -2.833213344056216)],
-                               n = 23},
-                   koData =
-                     ClassData{prior = -1.575536360758419, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -0.8873031950009028),
-                                    ("hour", -0.8873031950009028)],
-                               n = 6}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_CN.hs b/Duckling/Ranking/Classifiers/ZH_CN.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ZH_CN.hs
@@ -0,0 +1,879 @@
+-- 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.ZH_CN (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5020919437972361, unseen = -3.871201010907891,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 46},
+                   koData =
+                     ClassData{prior = -0.9295359586241757,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("the day before yesterday",
+        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}}),
+       ("today",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453), ("Sunday", -0.6931471805599453)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.7376696182833684,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5}}),
+       ("national 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}}),
+       ("Wednesday",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -1.5705980791178364),
+                                    ("dayday", -1.9070703157390494),
+                                    ("hourhour", -3.005682604407159),
+                                    ("hourminute", -3.5165082281731497),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -1.9070703157390494),
+                                    ("dayminute", -3.5165082281731497),
+                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.5165082281731497),
+                                    ("yearday", -1.5705980791178364)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.0388930539664873,
+                               unseen = -4.1588830833596715,
+                               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),
+                                    ("<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),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.044522437723423),
+                                    ("absorption of , after named dayFebruary",
+                                     -2.063693184711697)],
+                               n = 23}}),
+       ("year (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}}),
+       ("Saturday",
+        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}}),
+       ("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,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6418538861723948, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8602012652231115),
+                                    ("week (grain)", -0.8602012652231115)],
+                               n = 10}}),
+       ("last 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}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Monday", -1.8718021769015913), ("day", -0.7323678937132265),
+                                    ("Tuesday", -1.5533484457830569)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("mm/dd/yyyy",
+        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}}),
+       ("evening|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}}),
+       ("Monday",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("next 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}}),
+       ("hh:mm (time-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}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -1.3217558399823195,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.2809338454620642),
+                                    ("integer (0..10)", -0.325422400434628)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.2192034840549946),
+                                    ("integer (0..10)", -0.11506932978478723)],
+                               n = 44}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
+                                    ("monthday", -0.7472144018302211),
+                                    ("month (numeric with month symbol)ordinal (digits)Monday",
+                                     -1.3350010667323402)],
+                               n = 8},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0296194171811581),
+                                    ("integer (0..10)", -0.4418327522790392)],
+                               n = 40},
+                   koData =
+                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
+                               n = 6}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8434293836092833,
+                               unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -0.5625269981428811,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("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}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("tomorrow",
+        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 year",
+        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 <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.3437347467010947),
+                                    ("day", -0.7375989431307791), ("Tuesday", -1.3437347467010947)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -1.0185695809945732,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.916290731874155),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -0.916290731874155),
+                                    ("year", -2.3025850929940455)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.4480247225269604,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7339691750802004),
+                                    ("week (grain)", -0.7339691750802004)],
+                               n = 23}}),
+       ("minute (grain)",
+        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}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                               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},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
+                                    ("hourhour", -1.1631508098056809),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -2.0794415416798357),
+                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
+                                    ("hourminute", -1.9252908618525775),
+                                    ("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},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.2039728043259361),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -1.8971199848858813),
+                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
+                                    ("hourminute", -1.8971199848858813),
+                                    ("afternoon<integer> (latent time-of-day)",
+                                     -1.742969305058623)],
+                               n = 16}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                               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}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -1.252762968495368),
+                                    ("<integer> (latent time-of-day)", -1.540445040947149),
+                                    ("hour", -1.540445040947149), ("minute", -1.252762968495368)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 3}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (11..19)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5}}),
+       ("army'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}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
+                                    ("dayday", -0.7576857016975165)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8109302162163288),
+                                    ("SundayFebruary", -0.8109302162163288)],
+                               n = 7}}),
+       ("second (grain)",
+        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}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("last <time>",
+        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}}),
+       ("March",
+        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}}),
+       ("the day after tomorrow",
+        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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.24512245803298496,
+                               unseen = -3.784189633918261,
+                               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}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8362480242006186),
+                                    ("week (grain)", -0.8362480242006186)],
+                               n = 12}}),
+       ("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.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                               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)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tuesday",
+        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}}),
+       ("children'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}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                               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 (numeric)",
+                                     -2.1122313645028266),
+                                    ("Februaryinteger (0..10)", -2.740840023925201),
+                                    ("month", -0.7427441216993174),
+                                    ("month (numeric with month symbol)integer (0..10)",
+                                     -2.1122313645028266)],
+                               n = 58},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                   koData =
+                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                               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)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("labor 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}}),
+       ("women'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}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2076393647782445, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9980959022258835),
+                                    ("Monday", -1.9980959022258835), ("day", -0.8586616190375187),
+                                    ("hour", -2.9789251552376097), ("Tuesday", -1.6796421711073488),
+                                    ("week-end", -2.9789251552376097)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.6739764335716716, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.9985288301111273),
+                                    ("hour", -0.9985288301111273)],
+                               n = 6}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_HK.hs b/Duckling/Ranking/Classifiers/ZH_HK.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ZH_HK.hs
@@ -0,0 +1,879 @@
+-- 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.ZH_HK (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5020919437972361, unseen = -3.871201010907891,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 46},
+                   koData =
+                     ClassData{prior = -0.9295359586241757,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("the day before yesterday",
+        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}}),
+       ("today",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453), ("Sunday", -0.6931471805599453)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.7376696182833684,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5}}),
+       ("national 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}}),
+       ("Wednesday",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -1.5705980791178364),
+                                    ("dayday", -1.9070703157390494),
+                                    ("hourhour", -3.005682604407159),
+                                    ("hourminute", -3.5165082281731497),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -1.9070703157390494),
+                                    ("dayminute", -3.5165082281731497),
+                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.5165082281731497),
+                                    ("yearday", -1.5705980791178364)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.0388930539664873,
+                               unseen = -4.1588830833596715,
+                               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),
+                                    ("<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),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.044522437723423),
+                                    ("absorption of , after named dayFebruary",
+                                     -2.063693184711697)],
+                               n = 23}}),
+       ("year (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}}),
+       ("Saturday",
+        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}}),
+       ("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,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6418538861723948, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8602012652231115),
+                                    ("week (grain)", -0.8602012652231115)],
+                               n = 10}}),
+       ("last 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}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Monday", -1.8718021769015913), ("day", -0.7323678937132265),
+                                    ("Tuesday", -1.5533484457830569)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("mm/dd/yyyy",
+        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}}),
+       ("evening|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}}),
+       ("Monday",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("next 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}}),
+       ("hh:mm (time-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}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -1.3217558399823195,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.2809338454620642),
+                                    ("integer (0..10)", -0.325422400434628)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.2192034840549946),
+                                    ("integer (0..10)", -0.11506932978478723)],
+                               n = 44}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
+                                    ("monthday", -0.7472144018302211),
+                                    ("month (numeric with month symbol)ordinal (digits)Monday",
+                                     -1.3350010667323402)],
+                               n = 8},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0296194171811581),
+                                    ("integer (0..10)", -0.4418327522790392)],
+                               n = 40},
+                   koData =
+                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
+                               n = 6}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8434293836092833,
+                               unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -0.5625269981428811,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("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}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("tomorrow",
+        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 year",
+        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 <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.3437347467010947),
+                                    ("day", -0.7375989431307791), ("Tuesday", -1.3437347467010947)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -1.0185695809945732,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.916290731874155),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -0.916290731874155),
+                                    ("year", -2.3025850929940455)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.4480247225269604,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7339691750802004),
+                                    ("week (grain)", -0.7339691750802004)],
+                               n = 23}}),
+       ("minute (grain)",
+        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}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                               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},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
+                                    ("hourhour", -1.1631508098056809),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -2.0794415416798357),
+                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
+                                    ("hourminute", -1.9252908618525775),
+                                    ("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},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.2039728043259361),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -1.8971199848858813),
+                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
+                                    ("hourminute", -1.8971199848858813),
+                                    ("afternoon<integer> (latent time-of-day)",
+                                     -1.742969305058623)],
+                               n = 16}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                               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}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -1.252762968495368),
+                                    ("<integer> (latent time-of-day)", -1.540445040947149),
+                                    ("hour", -1.540445040947149), ("minute", -1.252762968495368)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 3}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (11..19)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5}}),
+       ("army'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}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
+                                    ("dayday", -0.7576857016975165)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8109302162163288),
+                                    ("SundayFebruary", -0.8109302162163288)],
+                               n = 7}}),
+       ("second (grain)",
+        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}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("last <time>",
+        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}}),
+       ("March",
+        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}}),
+       ("the day after tomorrow",
+        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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.24512245803298496,
+                               unseen = -3.784189633918261,
+                               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}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8362480242006186),
+                                    ("week (grain)", -0.8362480242006186)],
+                               n = 12}}),
+       ("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.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                               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)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tuesday",
+        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}}),
+       ("children'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}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                               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 (numeric)",
+                                     -2.1122313645028266),
+                                    ("Februaryinteger (0..10)", -2.740840023925201),
+                                    ("month", -0.7427441216993174),
+                                    ("month (numeric with month symbol)integer (0..10)",
+                                     -2.1122313645028266)],
+                               n = 58},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                   koData =
+                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                               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)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("labor 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}}),
+       ("women'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}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2076393647782445, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9980959022258835),
+                                    ("Monday", -1.9980959022258835), ("day", -0.8586616190375187),
+                                    ("hour", -2.9789251552376097), ("Tuesday", -1.6796421711073488),
+                                    ("week-end", -2.9789251552376097)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.6739764335716716, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.9985288301111273),
+                                    ("hour", -0.9985288301111273)],
+                               n = 6}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_MO.hs b/Duckling/Ranking/Classifiers/ZH_MO.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ZH_MO.hs
@@ -0,0 +1,879 @@
+-- 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.ZH_MO (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5020919437972361, unseen = -3.871201010907891,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 46},
+                   koData =
+                     ClassData{prior = -0.9295359586241757,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("the day before yesterday",
+        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}}),
+       ("today",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453), ("Sunday", -0.6931471805599453)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.7376696182833684,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5}}),
+       ("national 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}}),
+       ("Wednesday",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -1.5705980791178364),
+                                    ("dayday", -1.9070703157390494),
+                                    ("hourhour", -3.005682604407159),
+                                    ("hourminute", -3.5165082281731497),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -1.9070703157390494),
+                                    ("dayminute", -3.5165082281731497),
+                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.5165082281731497),
+                                    ("yearday", -1.5705980791178364)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.0388930539664873,
+                               unseen = -4.1588830833596715,
+                               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),
+                                    ("<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),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.044522437723423),
+                                    ("absorption of , after named dayFebruary",
+                                     -2.063693184711697)],
+                               n = 23}}),
+       ("year (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}}),
+       ("Saturday",
+        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}}),
+       ("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,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6418538861723948, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8602012652231115),
+                                    ("week (grain)", -0.8602012652231115)],
+                               n = 10}}),
+       ("last 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}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Monday", -1.8718021769015913), ("day", -0.7323678937132265),
+                                    ("Tuesday", -1.5533484457830569)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("mm/dd/yyyy",
+        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}}),
+       ("evening|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}}),
+       ("Monday",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("next 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}}),
+       ("hh:mm (time-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}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -1.3217558399823195,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.2809338454620642),
+                                    ("integer (0..10)", -0.325422400434628)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.2192034840549946),
+                                    ("integer (0..10)", -0.11506932978478723)],
+                               n = 44}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
+                                    ("monthday", -0.7472144018302211),
+                                    ("month (numeric with month symbol)ordinal (digits)Monday",
+                                     -1.3350010667323402)],
+                               n = 8},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0296194171811581),
+                                    ("integer (0..10)", -0.4418327522790392)],
+                               n = 40},
+                   koData =
+                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
+                               n = 6}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8434293836092833,
+                               unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -0.5625269981428811,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("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}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("tomorrow",
+        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 year",
+        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 <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.3437347467010947),
+                                    ("day", -0.7375989431307791), ("Tuesday", -1.3437347467010947)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -1.0185695809945732,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.916290731874155),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -0.916290731874155),
+                                    ("year", -2.3025850929940455)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.4480247225269604,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7339691750802004),
+                                    ("week (grain)", -0.7339691750802004)],
+                               n = 23}}),
+       ("minute (grain)",
+        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}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                               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},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
+                                    ("hourhour", -1.1631508098056809),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -2.0794415416798357),
+                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
+                                    ("hourminute", -1.9252908618525775),
+                                    ("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},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.2039728043259361),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -1.8971199848858813),
+                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
+                                    ("hourminute", -1.8971199848858813),
+                                    ("afternoon<integer> (latent time-of-day)",
+                                     -1.742969305058623)],
+                               n = 16}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                               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}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -1.252762968495368),
+                                    ("<integer> (latent time-of-day)", -1.540445040947149),
+                                    ("hour", -1.540445040947149), ("minute", -1.252762968495368)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 3}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (11..19)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5}}),
+       ("army'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}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
+                                    ("dayday", -0.7576857016975165)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8109302162163288),
+                                    ("SundayFebruary", -0.8109302162163288)],
+                               n = 7}}),
+       ("second (grain)",
+        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}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("last <time>",
+        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}}),
+       ("March",
+        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}}),
+       ("the day after tomorrow",
+        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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.24512245803298496,
+                               unseen = -3.784189633918261,
+                               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}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8362480242006186),
+                                    ("week (grain)", -0.8362480242006186)],
+                               n = 12}}),
+       ("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.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                               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)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tuesday",
+        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}}),
+       ("children'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}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                               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 (numeric)",
+                                     -2.1122313645028266),
+                                    ("Februaryinteger (0..10)", -2.740840023925201),
+                                    ("month", -0.7427441216993174),
+                                    ("month (numeric with month symbol)integer (0..10)",
+                                     -2.1122313645028266)],
+                               n = 58},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                   koData =
+                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                               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)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("labor 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}}),
+       ("women'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}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2076393647782445, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9980959022258835),
+                                    ("Monday", -1.9980959022258835), ("day", -0.8586616190375187),
+                                    ("hour", -2.9789251552376097), ("Tuesday", -1.6796421711073488),
+                                    ("week-end", -2.9789251552376097)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.6739764335716716, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.9985288301111273),
+                                    ("hour", -0.9985288301111273)],
+                               n = 6}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_TW.hs b/Duckling/Ranking/Classifiers/ZH_TW.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ZH_TW.hs
@@ -0,0 +1,879 @@
+-- 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.ZH_TW (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5020919437972361, unseen = -3.871201010907891,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 46},
+                   koData =
+                     ClassData{prior = -0.9295359586241757,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("the day before yesterday",
+        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}}),
+       ("today",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453), ("Sunday", -0.6931471805599453)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.7376696182833684,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5}}),
+       ("national 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}}),
+       ("Wednesday",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -1.5705980791178364),
+                                    ("dayday", -1.9070703157390494),
+                                    ("hourhour", -3.005682604407159),
+                                    ("hourminute", -3.5165082281731497),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -1.9070703157390494),
+                                    ("dayminute", -3.5165082281731497),
+                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.5165082281731497),
+                                    ("yearday", -1.5705980791178364)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.0388930539664873,
+                               unseen = -4.1588830833596715,
+                               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),
+                                    ("<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),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.044522437723423),
+                                    ("absorption of , after named dayFebruary",
+                                     -2.063693184711697)],
+                               n = 23}}),
+       ("year (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}}),
+       ("Saturday",
+        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}}),
+       ("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,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6418538861723948, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8602012652231115),
+                                    ("week (grain)", -0.8602012652231115)],
+                               n = 10}}),
+       ("last 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}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Monday", -1.8718021769015913), ("day", -0.7323678937132265),
+                                    ("Tuesday", -1.5533484457830569)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("mm/dd/yyyy",
+        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}}),
+       ("evening|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}}),
+       ("Monday",
+        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}}),
+       ("yesterday",
+        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}}),
+       ("next 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}}),
+       ("hh:mm (time-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}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -1.3217558399823195,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.2809338454620642),
+                                    ("integer (0..10)", -0.325422400434628)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.2192034840549946),
+                                    ("integer (0..10)", -0.11506932978478723)],
+                               n = 44}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
+                                    ("monthday", -0.7472144018302211),
+                                    ("month (numeric with month symbol)ordinal (digits)Monday",
+                                     -1.3350010667323402)],
+                               n = 8},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0296194171811581),
+                                    ("integer (0..10)", -0.4418327522790392)],
+                               n = 40},
+                   koData =
+                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
+                               n = 6}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8434293836092833,
+                               unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -0.5625269981428811,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("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}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("tomorrow",
+        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 year",
+        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 <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.3437347467010947),
+                                    ("day", -0.7375989431307791), ("Tuesday", -1.3437347467010947)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -1.0185695809945732,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.916290731874155),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -0.916290731874155),
+                                    ("year", -2.3025850929940455)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.4480247225269604,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7339691750802004),
+                                    ("week (grain)", -0.7339691750802004)],
+                               n = 23}}),
+       ("minute (grain)",
+        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}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                               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},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
+                                    ("hourhour", -1.1631508098056809),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -2.0794415416798357),
+                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
+                                    ("hourminute", -1.9252908618525775),
+                                    ("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},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.2039728043259361),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -1.8971199848858813),
+                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
+                                    ("hourminute", -1.8971199848858813),
+                                    ("afternoon<integer> (latent time-of-day)",
+                                     -1.742969305058623)],
+                               n = 16}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                               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}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -1.252762968495368),
+                                    ("<integer> (latent time-of-day)", -1.540445040947149),
+                                    ("hour", -1.540445040947149), ("minute", -1.252762968495368)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 3}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (11..19)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5}}),
+       ("army'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}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
+                                    ("dayday", -0.7576857016975165)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8109302162163288),
+                                    ("SundayFebruary", -0.8109302162163288)],
+                               n = 7}}),
+       ("second (grain)",
+        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}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("last <time>",
+        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}}),
+       ("March",
+        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}}),
+       ("the day after tomorrow",
+        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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.24512245803298496,
+                               unseen = -3.784189633918261,
+                               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}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8362480242006186),
+                                    ("week (grain)", -0.8362480242006186)],
+                               n = 12}}),
+       ("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.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                               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)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tuesday",
+        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}}),
+       ("children'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}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                               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 (numeric)",
+                                     -2.1122313645028266),
+                                    ("Februaryinteger (0..10)", -2.740840023925201),
+                                    ("month", -0.7427441216993174),
+                                    ("month (numeric with month symbol)integer (0..10)",
+                                     -2.1122313645028266)],
+                               n = 58},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                   koData =
+                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                               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)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("labor 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}}),
+       ("women'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}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2076393647782445, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9980959022258835),
+                                    ("Monday", -1.9980959022258835), ("day", -0.8586616190375187),
+                                    ("hour", -2.9789251552376097), ("Tuesday", -1.6796421711073488),
+                                    ("week-end", -2.9789251552376097)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.6739764335716716, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.9985288301111273),
+                                    ("hour", -0.9985288301111273)],
+                               n = 6}})]
diff --git a/Duckling/Ranking/Classifiers/ZH_XX.hs b/Duckling/Ranking/Classifiers/ZH_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/ZH_XX.hs
@@ -0,0 +1,864 @@
+-- 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.ZH_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers
+  = HashMap.fromList
+      [("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> am|pm", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        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}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.5020919437972361, unseen = -3.871201010907891,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 46},
+                   koData =
+                     ClassData{prior = -0.9295359586241757,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30}}),
+       ("the day before yesterday",
+        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}}),
+       ("today",
+        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",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -0.6931471805599453), ("Sunday", -0.6931471805599453)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               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}}),
+       ("October",
+        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}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -0.4700036292457356,
+                               unseen = -3.7376696182833684,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = -0.4418327522790392, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.0296194171811581,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 5}}),
+       ("Wednesday",
+        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}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                    ("year (numeric with year symbol)<named-month> <day-of-month>",
+                                     -1.5705980791178364),
+                                    ("dayday", -1.9070703157390494),
+                                    ("hourhour", -3.005682604407159),
+                                    ("hourminute", -3.5165082281731497),
+                                    ("absorption of , after named day<named-month> <day-of-month>",
+                                     -1.9070703157390494),
+                                    ("dayminute", -3.5165082281731497),
+                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.5165082281731497),
+                                    ("yearday", -1.5705980791178364)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -1.0388930539664873,
+                               unseen = -4.1588830833596715,
+                               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),
+                                    ("<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),
+                                    ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
+                                     -3.044522437723423),
+                                    ("absorption of , after named dayFebruary",
+                                     -2.063693184711697)],
+                               n = 23}}),
+       ("year (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}}),
+       ("Saturday",
+        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}}),
+       ("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,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6418538861723948, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8602012652231115),
+                                    ("week (grain)", -0.8602012652231115)],
+                               n = 10}}),
+       ("last 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}}),
+       ("this <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.970291913552122,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Monday", -1.8718021769015913), ("day", -0.7323678937132265),
+                                    ("Tuesday", -1.5533484457830569)],
+                               n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               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}}),
+       ("mm/dd/yyyy",
+        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.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yesterday",
+        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}}),
+       ("next 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}}),
+       ("hh:mm (time-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}}),
+       ("<integer> (latent time-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -1.3217558399823195,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.2809338454620642),
+                                    ("integer (0..10)", -0.325422400434628)],
+                               n = 16},
+                   koData =
+                     ClassData{prior = -0.3101549283038396,
+                               unseen = -3.8501476017100584,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -2.2192034840549946),
+                                    ("integer (0..10)", -0.11506932978478723)],
+                               n = 44}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
+                                    ("monthday", -0.7472144018302211),
+                                    ("month (numeric with month symbol)ordinal (digits)Monday",
+                                     -1.3350010667323402)],
+                               n = 8},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.0296194171811581),
+                                    ("integer (0..10)", -0.4418327522790392)],
+                               n = 40},
+                   koData =
+                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
+                               n = 6}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8434293836092833,
+                               unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -0.5625269981428811,
+                               unseen = -3.9318256327243257,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 49}}),
+       ("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}}),
+       ("year (numeric with year symbol)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        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}}),
+       ("numbers prefix with -, negative or minus",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 4}}),
+       ("Friday",
+        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}}),
+       ("tomorrow",
+        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 year",
+        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 <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.3437347467010947),
+                                    ("day", -0.7375989431307791), ("Tuesday", -1.3437347467010947)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("afternoon",
+        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}}),
+       ("<duration> from now",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("this <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -1.0185695809945732,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.916290731874155),
+                                    ("year (grain)", -2.3025850929940455),
+                                    ("week (grain)", -0.916290731874155),
+                                    ("year", -2.3025850929940455)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -0.4480247225269604,
+                               unseen = -3.9318256327243257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.7339691750802004),
+                                    ("week (grain)", -0.7339691750802004)],
+                               n = 23}}),
+       ("minute (grain)",
+        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}}),
+       ("<dim time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -0.7357067949787413),
+                                    ("<named-month> <day-of-month>morning", -1.3062516534463542),
+                                    ("children's dayafternoon", -2.772588722239781),
+                                    ("Mondaymorning", -1.6739764335716716)],
+                               n = 22},
+                   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,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
+                                    ("hourhour", -1.1631508098056809),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -2.0794415416798357),
+                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
+                                    ("hourminute", -1.9252908618525775),
+                                    ("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},
+                   koData =
+                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourhour", -1.2039728043259361),
+                                    ("afternoonrelative minutes after|past <integer> (hour-of-day)",
+                                     -1.8971199848858813),
+                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
+                                    ("hourminute", -1.8971199848858813),
+                                    ("afternoon<integer> (latent time-of-day)",
+                                     -1.742969305058623)],
+                               n = 16}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                               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}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mm (time-of-day)", -1.252762968495368),
+                                    ("<integer> (latent time-of-day)", -1.540445040947149),
+                                    ("hour", -1.540445040947149), ("minute", -1.252762968495368)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 3}}),
+       ("relative minutes after|past <integer> (hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (11..19)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)integer (0..10)",
+                                     -0.7731898882334817),
+                                    ("hour", -0.7731898882334817)],
+                               n = 5}}),
+       ("army'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}}),
+       ("intersect by \",\"",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
+                                    ("dayday", -0.7576857016975165)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.8109302162163288),
+                                    ("SundayFebruary", -0.8109302162163288)],
+                               n = 7}}),
+       ("second (grain)",
+        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}}),
+       ("<duration> ago",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.2617630984737906), ("second", -2.772588722239781),
+                                    ("day", -2.2617630984737906), ("year", -2.772588722239781),
+                                    ("<integer> <unit-of-duration>", -0.8266785731844679),
+                                    ("hour", -2.2617630984737906), ("month", -2.772588722239781),
+                                    ("minute", -2.772588722239781)],
+                               n = 20}}),
+       ("last <time>",
+        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}}),
+       ("March",
+        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}}),
+       ("the day after tomorrow",
+        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}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.24512245803298496,
+                               unseen = -3.784189633918261,
+                               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}}),
+       ("last <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.3862943611198906),
+                                    ("month (grain)", -1.791759469228055),
+                                    ("year (grain)", -2.4849066497880004),
+                                    ("week (grain)", -1.3862943611198906),
+                                    ("year", -2.4849066497880004), ("month", -1.791759469228055)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.5596157879354228,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.8362480242006186),
+                                    ("week (grain)", -0.8362480242006186)],
+                               n = 12}}),
+       ("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.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                               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)],
+                               n = 42},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tuesday",
+        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}}),
+       ("children'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}}),
+       ("<named-month> <day-of-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                               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 (numeric)",
+                                     -2.1122313645028266),
+                                    ("Februaryinteger (0..10)", -2.740840023925201),
+                                    ("month", -0.7427441216993174),
+                                    ("month (numeric with month symbol)integer (0..10)",
+                                     -2.1122313645028266)],
+                               n = 58},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (0..10)",
+        Classifier{okData =
+                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                   koData =
+                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+       ("last n <cycle>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               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},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("n <cycle> last",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                               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)],
+                               n = 20},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("morning",
+        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}}),
+       ("week-end",
+        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 (grain)",
+        Classifier{okData =
+                     ClassData{prior = -6.453852113757118e-2,
+                               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}}),
+       ("labor 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}}),
+       ("women'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}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.2076393647782445, unseen = -4.0943445622221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.9980959022258835),
+                                    ("Monday", -1.9980959022258835), ("day", -0.8586616190375187),
+                                    ("hour", -2.9789251552376097), ("Tuesday", -1.6796421711073488),
+                                    ("week-end", -2.9789251552376097)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.6739764335716716, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> (latent time-of-day)", -0.9985288301111273),
+                                    ("hour", -0.9985288301111273)],
+                               n = 6}})]
diff --git a/Duckling/Resolve.hs b/Duckling/Resolve.hs
--- a/Duckling/Resolve.hs
+++ b/Duckling/Resolve.hs
@@ -22,7 +22,7 @@
 import qualified Data.Time as Time
 import qualified Data.Time.LocalTime.TimeZone.Series as Series
 
-import Duckling.Lang
+import Duckling.Locale
 
 -- | Internal time reference.
 -- We work as if we were in UTC time and use `ZoneSeriesTime` to house the info.
@@ -32,7 +32,7 @@
 
 data Context = Context
   { referenceTime :: DucklingTime
-  , lang :: Lang
+  , locale :: Locale
   }
   deriving (Eq, Show)
 
diff --git a/Duckling/Rules.hs b/Duckling/Rules.hs
--- a/Duckling/Rules.hs
+++ b/Duckling/Rules.hs
@@ -20,9 +20,11 @@
 
 import Duckling.Dimensions
 import Duckling.Dimensions.Types
-import Duckling.Lang
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Rules.AR as ARRules
 import qualified Duckling.Rules.Common as CommonRules
+import qualified Duckling.Rules.BG as BGRules
 import qualified Duckling.Rules.CS as CSRules
 import qualified Duckling.Rules.DA as DARules
 import qualified Duckling.Rules.DE as DERules
@@ -33,9 +35,11 @@
 import qualified Duckling.Rules.GA as GARules
 import qualified Duckling.Rules.HE as HERules
 import qualified Duckling.Rules.HR as HRRules
+import qualified Duckling.Rules.HU as HURules
 import qualified Duckling.Rules.ID as IDRules
 import qualified Duckling.Rules.IT as ITRules
 import qualified Duckling.Rules.JA as JARules
+import qualified Duckling.Rules.KA as KARules
 import qualified Duckling.Rules.KO as KORules
 import qualified Duckling.Rules.MY as MYRules
 import qualified Duckling.Rules.NB as NBRules
@@ -49,49 +53,119 @@
 import qualified Duckling.Rules.UK as UKRules
 import qualified Duckling.Rules.VI as VIRules
 import qualified Duckling.Rules.ZH as ZHRules
-import Duckling.Types
 
 -- | Returns the minimal set of rules required for `targets`.
-rulesFor :: Lang -> HashSet (Some Dimension) -> [Rule]
-rulesFor lang targets
-  | HashSet.null targets = allRules lang
+rulesFor :: Locale -> HashSet (Some Dimension) -> [Rule]
+rulesFor locale targets
+  | HashSet.null targets = allRules locale
   | otherwise = [ rules | dims <- HashSet.toList $ explicitDimensions targets
-                        , rules <- rulesFor' lang dims ]
+                        , rules <- rulesFor' locale dims ]
 
--- | Returns all the rules for `lang`.
+-- | Returns all the rules for the provided locale.
 -- We can't really use `allDimensions` as-is, since `TimeGrain` is not present.
-allRules :: Lang -> [Rule]
-allRules lang = concatMap (rulesFor' lang) . HashSet.toList .
-  explicitDimensions . HashSet.fromList $ allDimensions lang
+allRules :: Locale -> [Rule]
+allRules locale@(Locale lang _) = concatMap (rulesFor' locale) . HashSet.toList
+  . explicitDimensions . HashSet.fromList $ allDimensions lang
 
-rulesFor' :: Lang -> Some Dimension -> [Rule]
-rulesFor' lang dim = CommonRules.rules dim ++ langRules lang dim
+rulesFor' :: Locale -> Some Dimension -> [Rule]
+rulesFor' (Locale lang (Just region)) dim =
+  CommonRules.rules dim ++ langRules lang dim ++ localeRules lang region dim
+rulesFor' (Locale lang Nothing) dim =
+  CommonRules.rules dim ++ defaultRules lang dim
 
+-- | Default rules when no locale, for backward compatibility.
+defaultRules :: Lang -> Some Dimension -> [Rule]
+defaultRules AR = ARRules.defaultRules
+defaultRules BG = BGRules.defaultRules
+defaultRules CS = CSRules.defaultRules
+defaultRules DA = DARules.defaultRules
+defaultRules DE = DERules.defaultRules
+defaultRules EN = ENRules.defaultRules
+defaultRules ES = ESRules.defaultRules
+defaultRules ET = ETRules.defaultRules
+defaultRules FR = FRRules.defaultRules
+defaultRules GA = GARules.defaultRules
+defaultRules HE = HERules.defaultRules
+defaultRules HR = HRRules.defaultRules
+defaultRules HU = HURules.defaultRules
+defaultRules ID = IDRules.defaultRules
+defaultRules IT = ITRules.defaultRules
+defaultRules JA = JARules.defaultRules
+defaultRules KA = KARules.defaultRules
+defaultRules KO = KORules.defaultRules
+defaultRules MY = MYRules.defaultRules
+defaultRules NB = NBRules.defaultRules
+defaultRules NL = NLRules.defaultRules
+defaultRules PL = PLRules.defaultRules
+defaultRules PT = PTRules.defaultRules
+defaultRules RO = RORules.defaultRules
+defaultRules RU = RURules.defaultRules
+defaultRules SV = SVRules.defaultRules
+defaultRules TR = TRRules.defaultRules
+defaultRules UK = UKRules.defaultRules
+defaultRules VI = VIRules.defaultRules
+defaultRules ZH = ZHRules.defaultRules
+
+localeRules :: Lang -> Region -> Some Dimension -> [Rule]
+localeRules AR = ARRules.localeRules
+localeRules BG = BGRules.localeRules
+localeRules CS = CSRules.localeRules
+localeRules DA = DARules.localeRules
+localeRules DE = DERules.localeRules
+localeRules EN = ENRules.localeRules
+localeRules ES = ESRules.localeRules
+localeRules ET = ETRules.localeRules
+localeRules FR = FRRules.localeRules
+localeRules GA = GARules.localeRules
+localeRules HE = HERules.localeRules
+localeRules HR = HRRules.localeRules
+localeRules HU = HURules.localeRules
+localeRules ID = IDRules.localeRules
+localeRules IT = ITRules.localeRules
+localeRules JA = JARules.localeRules
+localeRules KA = KARules.localeRules
+localeRules KO = KORules.localeRules
+localeRules MY = MYRules.localeRules
+localeRules NB = NBRules.localeRules
+localeRules NL = NLRules.localeRules
+localeRules PL = PLRules.localeRules
+localeRules PT = PTRules.localeRules
+localeRules RO = RORules.localeRules
+localeRules RU = RURules.localeRules
+localeRules SV = SVRules.localeRules
+localeRules TR = TRRules.localeRules
+localeRules UK = UKRules.localeRules
+localeRules VI = VIRules.localeRules
+localeRules ZH = ZHRules.localeRules
+
 langRules :: Lang -> Some Dimension -> [Rule]
-langRules AR = ARRules.rules
-langRules CS = CSRules.rules
-langRules DA = DARules.rules
-langRules DE = DERules.rules
-langRules EN = ENRules.rules
-langRules ES = ESRules.rules
-langRules ET = ETRules.rules
-langRules FR = FRRules.rules
-langRules GA = GARules.rules
-langRules HE = HERules.rules
-langRules HR = HRRules.rules
-langRules ID = IDRules.rules
-langRules IT = ITRules.rules
-langRules JA = JARules.rules
-langRules KO = KORules.rules
-langRules MY = MYRules.rules
-langRules NB = NBRules.rules
-langRules NL = NLRules.rules
-langRules PL = PLRules.rules
-langRules PT = PTRules.rules
-langRules RO = RORules.rules
-langRules RU = RURules.rules
-langRules SV = SVRules.rules
-langRules TR = TRRules.rules
-langRules UK = UKRules.rules
-langRules VI = VIRules.rules
-langRules ZH = ZHRules.rules
+langRules AR = ARRules.langRules
+langRules BG = BGRules.langRules
+langRules CS = CSRules.langRules
+langRules DA = DARules.langRules
+langRules DE = DERules.langRules
+langRules EN = ENRules.langRules
+langRules ES = ESRules.langRules
+langRules ET = ETRules.langRules
+langRules FR = FRRules.langRules
+langRules GA = GARules.langRules
+langRules HE = HERules.langRules
+langRules HR = HRRules.langRules
+langRules HU = HURules.langRules
+langRules ID = IDRules.langRules
+langRules IT = ITRules.langRules
+langRules JA = JARules.langRules
+langRules KA = KARules.langRules
+langRules KO = KORules.langRules
+langRules MY = MYRules.langRules
+langRules NB = NBRules.langRules
+langRules NL = NLRules.langRules
+langRules PL = PLRules.langRules
+langRules PT = PTRules.langRules
+langRules RO = RORules.langRules
+langRules RU = RURules.langRules
+langRules SV = SVRules.langRules
+langRules TR = TRRules.langRules
+langRules UK = UKRules.langRules
+langRules VI = VIRules.langRules
+langRules ZH = ZHRules.langRules
diff --git a/Duckling/Rules/AR.hs b/Duckling/Rules/AR.hs
--- a/Duckling/Rules/AR.hs
+++ b/Duckling/Rules/AR.hs
@@ -10,26 +10,35 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.AR
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Numeral.AR.Rules as Numeral
 import qualified Duckling.Ordinal.AR.Rules as Ordinal
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+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 Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/BG.hs b/Duckling/Rules/BG.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/BG.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 #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Rules.BG
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.BG.Rules as Numeral
+import qualified Duckling.AmountOfMoney.BG.Rules as AmountOfMoney
+
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = []
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = []
+langRules (This TimeGrain) = []
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/CS.hs b/Duckling/Rules/CS.hs
--- a/Duckling/Rules/CS.hs
+++ b/Duckling/Rules/CS.hs
@@ -10,26 +10,35 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.CS
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Types
 import qualified Duckling.Distance.CS.Rules as Distance
 import qualified Duckling.Numeral.CS.Rules as Numeral
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = []
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = []
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = []
+langRules (This TimeGrain) = []
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/Common.hs b/Duckling/Rules/Common.hs
--- a/Duckling/Rules/Common.hs
+++ b/Duckling/Rules/Common.hs
@@ -14,22 +14,22 @@
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.Rules as AmountOfMoney
 import qualified Duckling.Distance.Rules as Distance
 import qualified Duckling.Duration.Rules as Duration
 import qualified Duckling.Email.Rules as Email
-import qualified Duckling.AmountOfMoney.Rules as AmountOfMoney
 import qualified Duckling.PhoneNumber.Rules as PhoneNumber
 import qualified Duckling.Temperature.Rules as Temperature
-import Duckling.Types
 import qualified Duckling.Url.Rules as Url
 import qualified Duckling.Volume.Rules as Volume
 
 rules :: Some Dimension -> [Rule]
+rules (This AmountOfMoney) = AmountOfMoney.rules
 rules (This Distance) = Distance.rules
 rules (This Duration) = Duration.rules
-rules (This Numeral) = []
 rules (This Email) = Email.rules
-rules (This AmountOfMoney) = AmountOfMoney.rules
+rules (This Numeral) = []
 rules (This Ordinal) = []
 rules (This PhoneNumber) = PhoneNumber.rules
 rules (This Quantity) = []
diff --git a/Duckling/Rules/DA.hs b/Duckling/Rules/DA.hs
--- a/Duckling/Rules/DA.hs
+++ b/Duckling/Rules/DA.hs
@@ -10,29 +10,38 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.DA
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Duration.DA.Rules as Duration
 import qualified Duckling.Numeral.DA.Rules as Numeral
 import qualified Duckling.Ordinal.DA.Rules as Ordinal
 import qualified Duckling.Time.DA.Rules as Time
 import qualified Duckling.TimeGrain.DA.Rules as TimeGrain
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/DE.hs b/Duckling/Rules/DE.hs
--- a/Duckling/Rules/DE.hs
+++ b/Duckling/Rules/DE.hs
@@ -10,29 +10,38 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.DE
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Duration.DE.Rules as Duration
 import qualified Duckling.Ordinal.DE.Rules as Ordinal
 import qualified Duckling.Numeral.DE.Rules as Numeral
 import qualified Duckling.Time.DE.Rules as Time
 import qualified Duckling.TimeGrain.DE.Rules as TimeGrain
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/EN.hs b/Duckling/Rules/EN.hs
--- a/Duckling/Rules/EN.hs
+++ b/Duckling/Rules/EN.hs
@@ -10,10 +10,16 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.EN
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
+import Prelude
+
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.EN.Rules as AmountOfMoney
 import qualified Duckling.Distance.EN.Rules as Distance
 import qualified Duckling.Duration.EN.Rules as Duration
@@ -23,22 +29,38 @@
 import qualified Duckling.Quantity.EN.Rules as Quantity
 import qualified Duckling.Temperature.EN.Rules as Temperature
 import qualified Duckling.Time.EN.Rules as Time
+import qualified Duckling.Time.EN.CA.Rules as TimeCA
+import qualified Duckling.Time.EN.GB.Rules as TimeGB
+import qualified Duckling.Time.EN.US.Rules as TimeUS
 import qualified Duckling.TimeGrain.EN.Rules as TimeGrain
-import Duckling.Types
 import qualified Duckling.Volume.EN.Rules as Volume
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = Email.rules
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = Quantity.rules
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules dim@(This Time) =
+  [ TimeUS.ruleMMDD
+  , TimeUS.ruleMMDDYYYY
+  , TimeUS.ruleThanksgiving
+  ] ++ langRules dim
+defaultRules dim = langRules dim
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules CA (This Time) = TimeCA.rules
+localeRules GB (This Time) = TimeGB.rules
+localeRules US (This Time) = TimeUS.rules
+localeRules _ _            = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = Email.rules
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = Quantity.rules
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/ES.hs b/Duckling/Rules/ES.hs
--- a/Duckling/Rules/ES.hs
+++ b/Duckling/Rules/ES.hs
@@ -10,10 +10,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.ES
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.ES.Rules as AmountOfMoney
 import qualified Duckling.Distance.ES.Rules as Distance
 import qualified Duckling.Numeral.ES.Rules as Numeral
@@ -22,20 +26,25 @@
 import qualified Duckling.Time.ES.Rules as Time
 import qualified Duckling.TimeGrain.ES.Rules as TimeGrain
 import qualified Duckling.Volume.ES.Rules as Volume
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/ET.hs b/Duckling/Rules/ET.hs
--- a/Duckling/Rules/ET.hs
+++ b/Duckling/Rules/ET.hs
@@ -10,26 +10,35 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.ET
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Numeral.ET.Rules as Numeral
 import qualified Duckling.Ordinal.ET.Rules as Ordinal
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+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 Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/FR.hs b/Duckling/Rules/FR.hs
--- a/Duckling/Rules/FR.hs
+++ b/Duckling/Rules/FR.hs
@@ -10,10 +10,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.FR
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.FR.Rules as AmountOfMoney
 import qualified Duckling.Distance.FR.Rules as Distance
 import qualified Duckling.Duration.FR.Rules as Duration
@@ -25,20 +29,25 @@
 import qualified Duckling.Time.FR.Rules as Time
 import qualified Duckling.TimeGrain.FR.Rules as TimeGrain
 import qualified Duckling.Volume.FR.Rules as Volume
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = Email.rules
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = Quantity.rules
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = Email.rules
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = Quantity.rules
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/GA.hs b/Duckling/Rules/GA.hs
--- a/Duckling/Rules/GA.hs
+++ b/Duckling/Rules/GA.hs
@@ -10,10 +10,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.GA
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.GA.Rules as AmountOfMoney
 import qualified Duckling.Distance.GA.Rules as Distance
 import qualified Duckling.Duration.GA.Rules as Duration
@@ -23,20 +27,25 @@
 import qualified Duckling.Time.GA.Rules as Time
 import qualified Duckling.TimeGrain.GA.Rules as TimeGrain
 import qualified Duckling.Volume.GA.Rules as Volume
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/HE.hs b/Duckling/Rules/HE.hs
--- a/Duckling/Rules/HE.hs
+++ b/Duckling/Rules/HE.hs
@@ -10,10 +10,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.HE
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Types
 import qualified Duckling.Duration.HE.Rules as Duration
 import qualified Duckling.Numeral.HE.Rules as Numeral
@@ -21,18 +24,24 @@
 import qualified Duckling.TimeGrain.HE.Rules as TimeGrain
 import qualified Duckling.Time.HE.Rules as Time
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/HR.hs b/Duckling/Rules/HR.hs
--- a/Duckling/Rules/HR.hs
+++ b/Duckling/Rules/HR.hs
@@ -10,10 +10,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.HR
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.HR.Rules as AmountOfMoney
 import qualified Duckling.Distance.HR.Rules as Distance
@@ -26,18 +29,25 @@
 import qualified Duckling.TimeGrain.HR.Rules as TimeGrain
 import qualified Duckling.Volume.HR.Rules as Volume
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = Quantity.rules
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = Quantity.rules
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/HU.hs b/Duckling/Rules/HU.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/HU.hs
@@ -0,0 +1,47 @@
+-- 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.Rules.HU
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Duration.HU.Rules as Duration
+import qualified Duckling.Numeral.HU.Rules as Numeral
+import qualified Duckling.Ordinal.HU.Rules as Ordinal
+import qualified Duckling.Time.HU.Rules as Time
+import qualified Duckling.TimeGrain.HU.Rules as TimeGrain
+
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/ID.hs b/Duckling/Rules/ID.hs
--- a/Duckling/Rules/ID.hs
+++ b/Duckling/Rules/ID.hs
@@ -10,27 +10,36 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.ID
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
-import qualified Duckling.AmountOfMoney.ID.Rules as AmountOfMoney
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.AmountOfMoney.ID.Rules as AmountOfMoney
 import qualified Duckling.Numeral.ID.Rules as Numeral
 import qualified Duckling.Ordinal.ID.Rules as Ordinal
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+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 Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/IT.hs b/Duckling/Rules/IT.hs
--- a/Duckling/Rules/IT.hs
+++ b/Duckling/Rules/IT.hs
@@ -10,10 +10,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.IT
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Duration.IT.Rules as Duration
 import qualified Duckling.Email.IT.Rules as Email
 import qualified Duckling.Numeral.IT.Rules as Numeral
@@ -22,20 +26,25 @@
 import qualified Duckling.Time.IT.Rules as Time
 import qualified Duckling.TimeGrain.IT.Rules as TimeGrain
 import qualified Duckling.Volume.IT.Rules as Volume
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = Email.rules
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = Email.rules
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/JA.hs b/Duckling/Rules/JA.hs
--- a/Duckling/Rules/JA.hs
+++ b/Duckling/Rules/JA.hs
@@ -10,28 +10,37 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.JA
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Numeral.JA.Rules as Numeral
 import qualified Duckling.Ordinal.JA.Rules as Ordinal
 import qualified Duckling.Temperature.JA.Rules as Temperature
 import qualified Duckling.TimeGrain.JA.Rules as TimeGrain
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = []
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = []
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/KA.hs b/Duckling/Rules/KA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/KA.hs
@@ -0,0 +1,43 @@
+-- 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.Rules.KA
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.KA.Rules as Numeral
+
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = []
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = []
+langRules (This TimeGrain) = []
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/KO.hs b/Duckling/Rules/KO.hs
--- a/Duckling/Rules/KO.hs
+++ b/Duckling/Rules/KO.hs
@@ -10,10 +10,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.KO
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.KO.Rules as AmountOfMoney
 import qualified Duckling.Distance.KO.Rules as Distance
 import qualified Duckling.Duration.KO.Rules as Duration
@@ -23,21 +27,26 @@
 import qualified Duckling.Temperature.KO.Rules as Temperature
 import qualified Duckling.Time.KO.Rules as Time
 import qualified Duckling.TimeGrain.KO.Rules as TimeGrain
-import Duckling.Types
 import qualified Duckling.Volume.KO.Rules as Volume
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = Quantity.rules
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = Quantity.rules
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/MY.hs b/Duckling/Rules/MY.hs
--- a/Duckling/Rules/MY.hs
+++ b/Duckling/Rules/MY.hs
@@ -10,25 +10,34 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.MY
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
-import qualified Duckling.Numeral.MY.Rules as Numeral
+import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.Numeral.MY.Rules as Numeral
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = []
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = []
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = []
+langRules (This TimeGrain) = []
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/NB.hs b/Duckling/Rules/NB.hs
--- a/Duckling/Rules/NB.hs
+++ b/Duckling/Rules/NB.hs
@@ -10,30 +10,39 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.NB
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.NB.Rules as AmountOfMoney
 import qualified Duckling.Duration.NB.Rules as Duration
 import qualified Duckling.Numeral.NB.Rules as Numeral
 import qualified Duckling.Ordinal.NB.Rules as Ordinal
 import qualified Duckling.Time.NB.Rules as Time
 import qualified Duckling.TimeGrain.NB.Rules as TimeGrain
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/NL.hs b/Duckling/Rules/NL.hs
--- a/Duckling/Rules/NL.hs
+++ b/Duckling/Rules/NL.hs
@@ -10,28 +10,39 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.NL
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Distance.NL.Rules as Distance
+import qualified Duckling.Duration.NL.Rules as Duration
 import qualified Duckling.Numeral.NL.Rules as Numeral
 import qualified Duckling.Ordinal.NL.Rules as Ordinal
+import qualified Duckling.TimeGrain.NL.Rules as TimeGrain
 import qualified Duckling.Volume.NL.Rules as Volume
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = []
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/PL.hs b/Duckling/Rules/PL.hs
--- a/Duckling/Rules/PL.hs
+++ b/Duckling/Rules/PL.hs
@@ -10,29 +10,38 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.PL
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Duration.PL.Rules as Duration
 import qualified Duckling.Numeral.PL.Rules as Numeral
 import qualified Duckling.Ordinal.PL.Rules as Ordinal
 import qualified Duckling.Time.PL.Rules as Time
 import qualified Duckling.TimeGrain.PL.Rules as TimeGrain
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/PT.hs b/Duckling/Rules/PT.hs
--- a/Duckling/Rules/PT.hs
+++ b/Duckling/Rules/PT.hs
@@ -10,10 +10,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.PT
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.PT.Rules as AmountOfMoney
 import qualified Duckling.Distance.PT.Rules as Distance
 import qualified Duckling.Numeral.PT.Rules as Numeral
@@ -23,21 +27,26 @@
 import qualified Duckling.Temperature.PT.Rules as Temperature
 import qualified Duckling.Time.PT.Rules as Time
 import qualified Duckling.TimeGrain.PT.Rules as TimeGrain
-import Duckling.Types
 import qualified Duckling.Volume.PT.Rules as Volume
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = PhoneNumber.rules
-rules (This Quantity) = Quantity.rules
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = PhoneNumber.rules
+langRules (This Quantity) = Quantity.rules
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/RO.hs b/Duckling/Rules/RO.hs
--- a/Duckling/Rules/RO.hs
+++ b/Duckling/Rules/RO.hs
@@ -10,10 +10,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.RO
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.RO.Rules as AmountOfMoney
 import qualified Duckling.Distance.RO.Rules as Distance
 import qualified Duckling.Duration.RO.Rules as Duration
@@ -24,20 +28,25 @@
 import qualified Duckling.Time.RO.Rules as Time
 import qualified Duckling.TimeGrain.RO.Rules as TimeGrain
 import qualified Duckling.Volume.RO.Rules as Volume
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = Quantity.rules
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = Quantity.rules
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/RU.hs b/Duckling/Rules/RU.hs
--- a/Duckling/Rules/RU.hs
+++ b/Duckling/Rules/RU.hs
@@ -10,26 +10,35 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.RU
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Numeral.RU.Rules as Numeral
 import qualified Duckling.Ordinal.RU.Rules as Ordinal
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+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 Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/SV.hs b/Duckling/Rules/SV.hs
--- a/Duckling/Rules/SV.hs
+++ b/Duckling/Rules/SV.hs
@@ -10,30 +10,39 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.SV
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.AmountOfMoney.SV.Rules as AmountOfMoney
 import qualified Duckling.Duration.SV.Rules as Duration
 import qualified Duckling.Ordinal.SV.Rules as Ordinal
 import qualified Duckling.Numeral.SV.Rules as Numeral
 import qualified Duckling.Time.SV.Rules as Time
 import qualified Duckling.TimeGrain.SV.Rules as TimeGrain
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = []
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/TR.hs b/Duckling/Rules/TR.hs
--- a/Duckling/Rules/TR.hs
+++ b/Duckling/Rules/TR.hs
@@ -10,10 +10,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.TR
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Types
 import qualified Duckling.Distance.TR.Rules as Distance
 import qualified Duckling.Duration.TR.Rules as Duration
@@ -23,18 +26,24 @@
 import qualified Duckling.TimeGrain.TR.Rules as TimeGrain
 import qualified Duckling.Volume.TR.Rules as Volume
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = Distance.rules
-rules (This Duration) = Duration.rules
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = []
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = Volume.rules
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = []
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = Volume.rules
diff --git a/Duckling/Rules/UK.hs b/Duckling/Rules/UK.hs
--- a/Duckling/Rules/UK.hs
+++ b/Duckling/Rules/UK.hs
@@ -10,26 +10,35 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.UK
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Numeral.UK.Rules as Numeral
 import qualified Duckling.Ordinal.UK.Rules as Ordinal
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = []
-rules (This TimeGrain) = []
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+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 Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/VI.hs b/Duckling/Rules/VI.hs
--- a/Duckling/Rules/VI.hs
+++ b/Duckling/Rules/VI.hs
@@ -10,10 +10,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.VI
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.VI.Rules as AmountOfMoney
 import qualified Duckling.Numeral.VI.Rules as Numeral
@@ -21,18 +24,24 @@
 import qualified Duckling.TimeGrain.VI.Rules as TimeGrain
 import qualified Duckling.Time.VI.Rules as Time
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = AmountOfMoney.rules
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = []
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules _ _ = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = []
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
diff --git a/Duckling/Rules/ZH.hs b/Duckling/Rules/ZH.hs
--- a/Duckling/Rules/ZH.hs
+++ b/Duckling/Rules/ZH.hs
@@ -10,29 +10,46 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Rules.ZH
-  ( rules
+  ( defaultRules
+  , langRules
+  , localeRules
   ) where
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Numeral.ZH.Rules as Numeral
 import qualified Duckling.Ordinal.ZH.Rules as Ordinal
 import qualified Duckling.Temperature.ZH.Rules as Temperature
 import qualified Duckling.Time.ZH.Rules as Time
+import qualified Duckling.Time.ZH.CN.Rules as TimeCN
+import qualified Duckling.Time.ZH.HK.Rules as TimeHK
+import qualified Duckling.Time.ZH.MO.Rules as TimeMO
+import qualified Duckling.Time.ZH.TW.Rules as TimeTW
 import qualified Duckling.TimeGrain.ZH.Rules as TimeGrain
-import Duckling.Types
 
-rules :: Some Dimension -> [Rule]
-rules (This Distance) = []
-rules (This Duration) = []
-rules (This Numeral) = Numeral.rules
-rules (This Email) = []
-rules (This AmountOfMoney) = []
-rules (This Ordinal) = Ordinal.rules
-rules (This PhoneNumber) = []
-rules (This Quantity) = []
-rules (This RegexMatch) = []
-rules (This Temperature) = Temperature.rules
-rules (This Time) = Time.rules
-rules (This TimeGrain) = TimeGrain.rules
-rules (This Url) = []
-rules (This Volume) = []
+defaultRules :: Some Dimension -> [Rule]
+defaultRules = langRules
+
+localeRules :: Region -> Some Dimension -> [Rule]
+localeRules CN (This Time) = TimeCN.rules
+localeRules HK (This Time) = TimeHK.rules
+localeRules MO (This Time) = TimeMO.rules
+localeRules TW (This Time) = TimeTW.rules
+localeRules _ _            = []
+
+langRules :: Some Dimension -> [Rule]
+langRules (This AmountOfMoney) = []
+langRules (This Distance) = []
+langRules (This Duration) = []
+langRules (This Email) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Ordinal) = Ordinal.rules
+langRules (This PhoneNumber) = []
+langRules (This Quantity) = []
+langRules (This RegexMatch) = []
+langRules (This Temperature) = Temperature.rules
+langRules (This Time) = Time.rules
+langRules (This TimeGrain) = TimeGrain.rules
+langRules (This Url) = []
+langRules (This Volume) = []
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ES}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/ES/Rules.hs b/Duckling/Temperature/ES/Rules.hs
--- a/Duckling/Temperature/ES/Rules.hs
+++ b/Duckling/Temperature/ES/Rules.hs
@@ -26,7 +26,7 @@
   { name = "<latent temp> temp"
   , pattern =
     [ dimension Temperature
-    , regex "(grados?)|\x00b0"
+    , regex "(grados?)|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -39,7 +39,7 @@
   { name = "<temp> Celsius"
   , pattern =
     [ dimension Temperature
-    , regex "(cent(i|\x00ed)grados?|c(el[cs]?(ius)?)?\\.?)"
+    , regex "(cent(i|í)grados?|c(el[cs]?(ius)?)?\\.?)"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/FR/Rules.hs b/Duckling/Temperature/FR/Rules.hs
--- a/Duckling/Temperature/FR/Rules.hs
+++ b/Duckling/Temperature/FR/Rules.hs
@@ -26,7 +26,7 @@
   { name = "<latent temp> degrees"
   , pattern =
     [ dimension Temperature
-    , regex "(deg(r(\x00e9|e|\x00e8))?s?\\.?)|\x00b0"
+    , regex "(deg(r(é|e|è))?s?\\.?)|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -65,7 +65,7 @@
   { name = "<latent temp> en dessous de zero"
   , pattern =
     [ dimension Temperature
-    , regex "en dessous de (0|z(\x00e9|e)ro)"
+    , regex "en dessous de (0|z(é|e)ro)"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td@(TemperatureData {TTemperature.value = v}):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/GA/Rules.hs b/Duckling/Temperature/GA/Rules.hs
--- a/Duckling/Temperature/GA/Rules.hs
+++ b/Duckling/Temperature/GA/Rules.hs
@@ -26,7 +26,7 @@
   { name = "<latent temp> céim"
   , pattern =
     [ dimension Temperature
-    , regex "g?ch?(\x00e9|e)im(e(anna)?)?|\x00b0"
+    , regex "g?ch?(é|e)im(e(anna)?)?|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -39,7 +39,7 @@
   { name = "<temp> Celsius"
   , pattern =
     [ dimension Temperature
-    , regex "ceinteagr(\x00e1|a)d|c(el[cs]?(ius)?)?\\.?"
+    , regex "ceinteagr(á|a)d|c(el[cs]?(ius)?)?\\.?"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -65,7 +65,7 @@
   { name = "<latent temp> faoi bhun náid"
   , pattern =
     [ dimension Temperature
-    , regex "faoi bhun (0|n(a|\x00e1)id)"
+    , regex "faoi bhun (0|n(a|á)id)"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td@(TemperatureData {TTemperature.value = v}):_) ->
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/HR/Rules.hs b/Duckling/Temperature/HR/Rules.hs
--- a/Duckling/Temperature/HR/Rules.hs
+++ b/Duckling/Temperature/HR/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent temp> stupnjevi"
   , pattern =
     [ dimension Temperature
-    , regex "deg\\.?|stupa?nj((ev)?a)?|\x00b0"
+    , regex "deg\\.?|stupa?nj((ev)?a)?|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
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
@@ -13,13 +13,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = IT}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/IT/Rules.hs b/Duckling/Temperature/IT/Rules.hs
--- a/Duckling/Temperature/IT/Rules.hs
+++ b/Duckling/Temperature/IT/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent temp> degrees"
   , pattern =
     [ dimension Temperature
-    , regex "(grad[io]?\\.?)|\x00b0"
+    , regex "(grad[io]?\\.?)|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = JA}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/JA/Rules.hs b/Duckling/Temperature/JA/Rules.hs
--- a/Duckling/Temperature/JA/Rules.hs
+++ b/Duckling/Temperature/JA/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent temp> degrees"
   , pattern =
     [ dimension Temperature
-    , regex "\x5ea6|\x00b0"
+    , regex "度|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -38,7 +38,7 @@
   { name = "<temp> Celcius"
   , pattern =
     [ dimension Temperature
-    , regex "\x6442\x6c0f(\x00b0|\x5ea6)|(\x00b0)C"
+    , regex "摂氏(°|度)|(°)C"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -50,9 +50,9 @@
 ruleCelciusTemp = Rule
   { name = "Celcius <temp>"
   , pattern =
-    [ regex "\x6442\x6c0f"
+    [ regex "摂氏"
     , dimension Temperature
-    , regex "\x5ea6|\x00b0"
+    , regex "度|°"
     ]
   , prod = \tokens -> case tokens of
       (_:Token Temperature td:_) -> Just . Token Temperature $
@@ -65,7 +65,7 @@
   { name = "<temp> Fahrenheit"
   , pattern =
     [ dimension Temperature
-    , regex "\x83ef\x6c0f(\x00b0|\x5ea6)|(\x00b0)F"
+    , regex "華氏(°|度)|(°)F"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -77,9 +77,9 @@
 ruleFahrenheitTemp = Rule
   { name = "Fahrenheit <temp>"
   , pattern =
-    [ regex "\x83ef\x6c0f"
+    [ regex "華氏"
     , dimension Temperature
-    , regex "\x5ea6|\x00b0"
+    , regex "度|°"
     ]
   , prod = \tokens -> case tokens of
       (_:Token Temperature td:_) -> Just . Token Temperature $
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, 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
@@ -25,7 +25,7 @@
   { name = "<latent temp> degrees"
   , pattern =
     [ Predicate isLatent
-    , regex "\xb3c4|\x00b0"
+    , regex "도|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -37,7 +37,7 @@
 ruleTemp = Rule
   { name = "섭씨 <temp>"
   , pattern =
-    [ regex "\xc12d\xc528"
+    [ regex "섭씨"
     , dimension Temperature
     ]
   , prod = \tokens -> case tokens of
@@ -63,7 +63,7 @@
 ruleTemp2 = Rule
   { name = "화씨 <temp>"
   , pattern =
-    [ regex "\xd654\xc528"
+    [ regex "화씨"
     , dimension Temperature
     ]
   , prod = \tokens -> case tokens of
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/PT/Rules.hs b/Duckling/Temperature/PT/Rules.hs
--- a/Duckling/Temperature/PT/Rules.hs
+++ b/Duckling/Temperature/PT/Rules.hs
@@ -26,7 +26,7 @@
   { name = "<latent temp> temp"
   , pattern =
     [ dimension Temperature
-    , regex "(graus?)|\x00b0"
+    , regex "(graus?)|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -39,7 +39,7 @@
   { name = "<temp> Celsius"
   , pattern =
     [ dimension Temperature
-    , regex "(cent(i|\x00ed)grados?|c(el[cs]?(ius)?)?\\.?)"
+    , regex "(cent(i|í)grados?|c(el[cs]?(ius)?)?\\.?)"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -65,7 +65,7 @@
   { name = "<latent temp> temp abaixo de zero"
   , pattern =
     [ dimension Temperature
-    , regex "((graus?)|\x00b0)?( abaixo (de)? zero)"
+    , regex "((graus?)|°)?( abaixo (de)? zero)"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td@(TemperatureData {TTemperature.value = v}):_) ->
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/RO/Rules.hs b/Duckling/Temperature/RO/Rules.hs
--- a/Duckling/Temperature/RO/Rules.hs
+++ b/Duckling/Temperature/RO/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent temp> grade"
   , pattern =
     [ dimension Temperature
-    , regex "(grade)|\x00b0"
+    , regex "(grade)|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
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
@@ -13,13 +13,13 @@
 
 import Prelude
 import Data.String
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = TR}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
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
@@ -14,13 +14,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Temperature.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ZH}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/ZH/Rules.hs b/Duckling/Temperature/ZH/Rules.hs
--- a/Duckling/Temperature/ZH/Rules.hs
+++ b/Duckling/Temperature/ZH/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent temp> degrees"
   , pattern =
     [ dimension Temperature
-    , regex "\x5ea6|\x00b0"
+    , regex "度|°"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -38,7 +38,7 @@
   { name = "<temp> Celcius"
   , pattern =
     [ dimension Temperature
-    , regex "(\x6444|\x651d)\x6c0f(\x00b0|\x5ea6)|(\x00b0)C"
+    , regex "(摄|攝)氏(°|度)|(°)C"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -50,9 +50,9 @@
 ruleCelciusTemp = Rule
   { name = "Celcius <temp>"
   , pattern =
-    [ regex "(\x6444|\x651d)\x6c0f"
+    [ regex "(摄|攝)氏"
     , dimension Temperature
-    , regex "\x5ea6|\x00b0"
+    , regex "度|°"
     ]
   , prod = \tokens -> case tokens of
       (_:Token Temperature td:_) -> Just . Token Temperature $
@@ -65,7 +65,7 @@
   { name = "<temp> Fahrenheit"
   , pattern =
     [ dimension Temperature
-    , regex "(\x534e|\x83ef)\x6c0f(\x00b0|\x5ea6)|(\x00b0)F"
+    , regex "(华|華)氏(°|度)|(°)F"
     ]
   , prod = \tokens -> case tokens of
       (Token Temperature td:_) -> Just . Token Temperature $
@@ -77,9 +77,9 @@
 ruleFahrenheitTemp = Rule
   { name = "Fahrenheit <temp>"
   , pattern =
-    [ regex "(\x534e|\x83ef)\x6c0f"
+    [ regex "(华|華)氏"
     , dimension Temperature
-    , regex "\x5ea6|\x00b0"
+    , regex "度|°"
     ]
   , prod = \tokens -> case tokens of
       (_:Token Temperature td:_) -> Just . Token Temperature $
diff --git a/Duckling/Testing/Types.hs b/Duckling/Testing/Types.hs
--- a/Duckling/Testing/Types.hs
+++ b/Duckling/Testing/Types.hs
@@ -21,6 +21,7 @@
   , parserCheck
   , refTime
   , testContext
+  , withLocale
   , zTime
   ) where
 
@@ -69,4 +70,10 @@
 -- Tuesday Feb 12, 2013 at 4:30am is the "now" for the tests
 testContext :: Context
 testContext = Context
-  {lang = EN, referenceTime = refTime (2013, 2, 12, 4, 30, 0) (-2)}
+  { locale = makeLocale EN Nothing
+  , 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)
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
@@ -9,12 +9,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.DA.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month)
@@ -22,7 +23,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = DA}, allExamples)
+corpus = (testContext {locale = makeLocale DA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -403,7 +404,7 @@
   , examples (datetime (1954, 0, 0, 0, 0, 0) Year)
              [ "1954"
              ]
-  , examples (datetime (2013, 12, 0, 0, 0, 0) Month)
+  , examples (datetime (2013, 12, 24, 0, 0, 0) Day)
              [ "et år efter juleaften"
              , "ét år efter juleaften"
              ]
diff --git a/Duckling/Time/DA/Rules.hs b/Duckling/Time/DA/Rules.hs
--- a/Duckling/Time/DA/Rules.hs
+++ b/Duckling/Time/DA/Rules.hs
@@ -13,29 +13,65 @@
 module Duckling.Time.DA.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
+import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData (..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
-import qualified Duckling.Time.Types as TTime
-import qualified Duckling.TimeGrain.Types as TG
 import Duckling.Regex.Types
 import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
+import qualified Duckling.Time.Types as TTime
+import qualified Duckling.TimeGrain.Types as TG
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mandag|man\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Monday"   , "mandag|man\\.?"           )
+  , ( "Tuesday"  , "tirsdag|tirs?\\.?"        )
+  , ( "Wednesday", "onsdag|ons\\.?"           )
+  , ( "Thursday" , "torsdag|tors?\\.?"        )
+  , ( "Friday"   , "fredag|fre\\.?"           )
+  , ( "Saturday" , "lørdag|lør\\.?" )
+  , ( "Sunday"   , "søndag|søn\\.?" )
+  ]
 
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "January"  , "januar|jan\\.?"      )
+  , ( "February" , "februar|feb\\.?"     )
+  , ( "March"    , "marts|mar\\.?"       )
+  , ( "April"    , "april|apr\\.?"       )
+  , ( "May"      , "maj"                 )
+  , ( "June"     , "juni|jun\\.?"        )
+  , ( "July"     , "juli|jul\\.?"        )
+  , ( "August"   , "august|aug\\.?"      )
+  , ( "September", "september|sept?\\.?" )
+  , ( "October"  , "oktober|okt\\.?"     )
+  , ( "November" , "november|nov\\.?"    )
+  , ( "December" , "december|dec\\.?"    )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleTheDayAfterTomorrow :: Rule
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow"
@@ -45,15 +81,6 @@
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "december|dec\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
@@ -74,7 +101,7 @@
 ruleQuarterTotillbeforeIntegerHourofday = Rule
   { name = "quarter to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "(et|\x00e9t)? ?kvart(er)? i"
+    [ regex "(et|ét)? ?kvart(er)? i"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -107,15 +134,6 @@
   , prod = \_ -> tt $ monthDay 6 5
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "tirsdag|tirs?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleValentinesDay :: Rule
 ruleValentinesDay = Rule
   { name = "valentine's day"
@@ -165,7 +183,7 @@
 ruleNewYearsDay = Rule
   { name = "new year's day"
   , pattern =
-    [ regex "nyt\x00e5rsdag"
+    [ regex "nytårsdag"
     ]
   , prod = \_ -> tt $ monthDay 1 1
   }
@@ -183,15 +201,6 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "l\x00f8rdag|l\x00f8r\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -206,15 +215,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juli|jul\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleEvening :: Rule
 ruleEvening = Rule
   { name = "evening"
@@ -273,7 +273,7 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "lige nu|nu|(i )?dette \x00f8jeblik"
+    [ regex "lige nu|nu|(i )?dette øjeblik"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -330,7 +330,7 @@
 ruleQuarterAfterpastIntegerHourofday = Rule
   { name = "quarter after|past <integer> (hour-of-day)"
   , pattern =
-    [ regex "(et|\x00e9t)? ?kvart(er)? over"
+    [ regex "(et|ét)? ?kvart(er)? over"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -377,15 +377,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "torsdag|tors?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleTheCycleAfterTime :: Rule
 ruleTheCycleAfterTime = Rule
   { name = "the <cycle> after <time>"
@@ -405,7 +396,7 @@
   { name = "the <cycle> before <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "(en|tet|et)? f\x00f8r"
+    , regex "(en|tet|et)? før"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -418,7 +409,7 @@
 ruleSeason4 = Rule
   { name = "season"
   , pattern =
-    [ regex "for\x00e5r"
+    [ regex "forår"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (monthDay 3 20) (monthDay 6 21)
@@ -441,7 +432,7 @@
 ruleTimeAfterNext = Rule
   { name = "<time> after next"
   , pattern =
-    [ regex "n(\x00e6)ste"
+    [ regex "n(æ)ste"
     , dimension Time
     , regex "igen"
     ]
@@ -487,7 +478,7 @@
 ruleThisnextDayofweek = Rule
   { name = "this|next <day-of-week>"
   , pattern =
-    [ regex "(kommende|n(\x00e6)ste)"
+    [ regex "(kommende|n(æ)ste)"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -500,7 +491,7 @@
 ruleTheDayBeforeYesterday = Rule
   { name = "the day before yesterday"
   , pattern =
-    [ regex "i forg\x00e5rs"
+    [ regex "i forgårs"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
@@ -524,7 +515,7 @@
 ruleNextCycle = Rule
   { name = "next <cycle>"
   , pattern =
-    [ regex "n(\x00e6)ste|kommende"
+    [ regex "n(æ)ste|kommende"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -533,15 +524,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "januar|jan\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleTheCycleOfTime :: Rule
 ruleTheCycleOfTime = Rule
   { name = "the <cycle> of <time>"
@@ -572,7 +554,7 @@
 ruleOnDate = Rule
   { name = "on <date>"
   , pattern =
-    [ regex "den|p\x00e5"
+    [ regex "den|på"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -580,15 +562,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "marts|mar\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleDurationFromNow :: Rule
 ruleDurationFromNow = Rule
   { name = "<duration> from now"
@@ -653,15 +626,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "april|apr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleTimeBeforeLast :: Rule
 ruleTimeBeforeLast = Rule
   { name = "<time> before last"
@@ -714,7 +678,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -731,7 +695,7 @@
   { name = "<hour-of-day> quarter (as relative minutes)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "(et|\x00e9t)? ?kvart(er)?"
+    , regex "(et|ét)? ?kvart(er)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
@@ -752,15 +716,6 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "fredag|fre\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -850,7 +805,7 @@
   , pattern =
     [ regex "(efter|fra)"
     , Predicate isATimeOfDay
-    , regex "((men )?f\x00f8r)|\\-|til|indtil"
+    , regex "((men )?før)|\\-|til|indtil"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -859,20 +814,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "februar|feb\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
 
 ruleExactlyTimeofday :: Rule
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
   , pattern =
-    [ regex "pr(\x00e6)cis( kl\\.| klokken)?"
+    [ regex "pr(æ)cis( kl\\.| klokken)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -937,7 +884,7 @@
 ruleNewYearsEve = Rule
   { name = "new year's eve"
   , pattern =
-    [ regex "nyt\x00e5rsaften(sdag)?"
+    [ regex "nytårsaften(sdag)?"
     ]
   , prod = \_ -> tt $ monthDay 12 31
   }
@@ -1000,7 +947,7 @@
   { name = "<time-of-day> sharp"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(sharp|pr(\x00e6)cis)"
+    , regex "(sharp|pr(æ)cis)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -1070,7 +1017,7 @@
 ruleUntilTimeofday = Rule
   { name = "until <time-of-day>"
   , pattern =
-    [ regex "(engang )?inden|indtil|f\x00f8r|op til"
+    [ regex "(engang )?inden|indtil|før|op til"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1090,15 +1037,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juni|jun\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -1117,15 +1055,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "august|aug\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -1145,10 +1074,7 @@
   , pattern =
     [ regex "(week(\\s|-)?end)(en)?"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleAboutDuration :: Rule
@@ -1196,7 +1122,7 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "n(\x00e6)ste|kommende"
+    [ regex "n(æ)ste|kommende"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -1268,7 +1194,7 @@
 ruleNextNCycle = Rule
   { name = "next n <cycle>"
   , pattern =
-    [ regex "n(\x00e6)ste"
+    [ regex "n(æ)ste"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -1283,7 +1209,7 @@
 ruleADuration = Rule
   { name = "a <duration>"
   , pattern =
-    [ regex "(om )?en|et|\x00e9n|\x00e9t"
+    [ regex "(om )?en|et|én|ét"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -1322,7 +1248,7 @@
 ruleThisCycle = Rule
   { name = "this <cycle>"
   , pattern =
-    [ regex "denne|dette|i|nuv(\x00e6)rende|indev(\x00e6)rende"
+    [ regex "denne|dette|i|nuv(æ)rende|indev(æ)rende"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -1386,7 +1312,7 @@
 ruleOnANamedday = Rule
   { name = "on a named-day"
   , pattern =
-    [ regex "p\x00e5 en"
+    [ regex "på en"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -1411,7 +1337,7 @@
 ruleYesterday = Rule
   { name = "yesterday"
   , pattern =
-    [ regex "i g\x00e5r|ig\x00e5r"
+    [ regex "i går|igår"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -1420,7 +1346,7 @@
 ruleSeason2 = Rule
   { name = "season"
   , pattern =
-    [ regex "efter\x00e5r"
+    [ regex "efterår"
     ]
   , prod = \_ ->
       let from = monthDay 9 23
@@ -1445,7 +1371,7 @@
 ruleChristmas = Rule
   { name = "christmas"
   , pattern =
-    [ regex "((1\\.?)|f\x00f8rste)? ?juledag"
+    [ regex "((1\\.?)|første)? ?juledag"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -1505,24 +1431,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "maj"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "s\x00f8ndag|s\x00f8n\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleHhmm :: Rule
 ruleHhmm = Rule
   { name = "hh:mm"
@@ -1562,15 +1470,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "oktober|okt\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleHalloweenDay :: Rule
 ruleHalloweenDay = Rule
   { name = "halloween day"
@@ -1633,7 +1532,7 @@
   { name = "<cycle> before <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "f\x00f8r"
+    , regex "før"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1661,7 +1560,7 @@
 ruleTimeofdayTimeofdayInterval = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\-|til|indtil"
     , Predicate isATimeOfDay
     ]
@@ -1671,15 +1570,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "november|nov\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleDurationAfterTime :: Rule
 ruleDurationAfterTime = Rule
   { name = "<duration> after <time>"
@@ -1709,15 +1599,6 @@
       _ -> Nothing
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "onsdag|ons\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleTheDayofmonthOrdinal :: Rule
 ruleTheDayofmonthOrdinal = Rule
   { name = "the <day-of-month> (ordinal)"
@@ -1736,7 +1617,7 @@
   { name = "<duration> before <time>"
   , pattern =
     [ dimension Duration
-    , regex "f\x00f8r"
+    , regex "før"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1799,15 +1680,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "september|sept?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -1846,7 +1718,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1917,25 +1789,6 @@
   , ruleMonthDdddInterval
   , ruleMorning
   , ruleMothersDay
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
   , ruleNewYearsDay
@@ -2005,3 +1858,5 @@
   , ruleHourofdayHalf
   , ruleTimezone
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -13,25 +13,26 @@
   , negativeCorpus
   ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 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)
-import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = DE}, allExamples)
+corpus = (testContext {locale = makeLocale DE Nothing}, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {lang = DE}, examples)
+negativeCorpus = (testContext {locale = makeLocale DE Nothing}, examples)
   where
     examples =
       [ "ein Hotel"
       , "ein Angebot"
+      , "nächsten 5"
       ]
 
 allExamples :: [Example]
@@ -306,7 +307,7 @@
              [ "viertel vor 12"
              , "11:45"
              ]
-  , examples (datetime (2013, 2, 12, 11, 45, 0) Second)
+  , examples (datetime (2013, 2, 12, 11, 45, 0) Minute)
              [ "15 minuten vor 12"
              ]
   , examples (datetime (2013, 2, 12, 20, 0, 0) Hour)
@@ -403,7 +404,7 @@
   , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
              [ "in 7 tagen"
              ]
-  , examples (datetime (2013, 12, 0, 0, 0, 0) Month)
+  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
              [ "ein jahr nach weihnachten"
              ]
   , examples (datetimeInterval ((2013, 6, 21, 0, 0, 0), (2013, 9, 24, 0, 0, 0)) Day)
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
@@ -13,39 +13,143 @@
 module Duckling.Time.DE.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
-import qualified Data.Text as Text
 import Prelude
+import Data.Text (Text)
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData (..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "montags?|mo\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
+instants :: [(Text, TG.Grain, Int, String)]
+instants =
+ [ ( "now"             , TG.Second,  0,
+       "(genau)? ?jetzt|diesen moment|in diesem moment|gerade eben" )
+ , ( "today"           , TG.Day   ,  0,
+       "heute|(um diese zeit|zu dieser zeit|um diesen zeitpunkt|zu diesem zeitpunkt)" )
+ , ( "tomorrow"        , TG.Day   ,  1, "morgen" )
+ , ( "yesterday"       , TG.Day   , -1, "gestern" )
+ , ( "after tomorrow"  , TG.Day   ,  2, "(ü)bermorgen" )
+ , ( "before yesterday", TG.Day   , -2, "vorgestern" )
+ , ( "EOM|End of month", TG.Month ,  1, "(das )?ende des monats?" )
+ , ( "EOY|End of year" , TG.Year  ,  1,
+       "(das )?(EOY|jahr(es)? ?ende|ende (des )?jahr(es)?)" )
+ ]
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "dezember|dez\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
+ruleInstants :: [Rule]
+ruleInstants = map go instants
+  where
+    go (name, grain, n, regexPattern) = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ cycleNth grain n
+      }
 
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Montag"    , "montags?|mo\\.?"              )
+  , ( "Dienstag"  , "die?nstags?|di\\.?"           )
+  , ( "Mittwoch"  , "mittwochs?|mi\\.?"            )
+  , ( "Donnerstag", "donn?erstag|do\\.?"           )
+  , ( "Freitag"   , "freitags?|fr\\.?"             )
+  , ( "Samstag"   , "samstags?|sonnabends?|sa\\.?" )
+  , ( "Sonntag"   , "sonntags?|so\\.?"             )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "Januar"   , "januar|jan\\.?"             )
+  , ( "Februar"  , "februar|feb\\.?"            )
+  , ( "Marz"     , "m(ä)rz|m(ä)r\\.?" )
+  , ( "April"    , "april|apr\\.?"              )
+  , ( "Mai"      , "mai\\.?"                    )
+  , ( "Juni"     , "juni|jun\\.?"               )
+  , ( "Juli"     , "juli|jul\\.?"               )
+  , ( "August"   , "august|aug\\.?"             )
+  , ( "September", "september|sept?\\.?"        )
+  , ( "Oktober"  , "oktober|okt\\.?"            )
+  , ( "November" , "november|nov\\.?"           )
+  , ( "Dezember" , "dezember|dez\\.?"           )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
+seasons :: [(Text, String, TimeData, TimeData)]
+seasons =
+  [ ( "sommer"  , "sommer"                , monthDay  6 21, monthDay  9 23 )
+  , ( "herbst"  , "herbst"                , monthDay  9 23, monthDay 12 21 )
+  , ( "winter"  , "winter"                , monthDay 12 21, monthDay  3 20 )
+  , ( "fruhling", "fr(ü)h(ling|jahr)", monthDay  3 20, monthDay  6 21 )
+  ]
+
+ruleSeasons :: [Rule]
+ruleSeasons = map go seasons
+  where
+    go (name, regexPattern, start, end) = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> Token Time <$> interval TTime.Open start end
+      }
+
+holidays :: [(Text, TimeData, String)]
+holidays =
+  [ ( "new year's day"                    , monthDay  1  1, "neujahr(s?tag)?" )
+  , ( "valentine's day"                   , monthDay  2 14, "valentin'?stag" )
+  , ( "Schweizer Bundesfeiertag"          , monthDay  8  1,
+        "schweiz(er)? (bundes)?feiertag|bundes feiertag" )
+  , ( "Tag der Deutschen Einheit"         , monthDay 10  3,
+        "tag (der)? deutsc?hen? einheit" )
+  , ( "Oesterreichischer Nationalfeiertag", monthDay 10 26,
+        "((ö)sterreichischer?)? nationalfeiertag|national feiertag" )
+  , ( "halloween day"                     , monthDay 10 31, "hall?owe?en?" )
+  , ( "Allerheiligen"                     , monthDay 11  1,
+        "allerheiligen?|aller heiligen?" )
+  , ( "Nikolaus"                          , monthDay 12  6,
+        "nikolaus(tag)?|nikolaus tag|nikolo" )
+  , ( "christmas eve"                     , monthDay 12 24,
+        "heilig(er)? abend" )
+  , ( "christmas"                         , monthDay 12 25,
+        "weih?nacht(en|stag)?" )
+  , ( "new year's eve"                    , monthDay 12 31,
+        "silvester" )
+  , ( "Mother's Day"                      , nthDOWOfMonth 2 7 5,
+        "mutt?ertag|mutt?er (tag)?" )
+  , ( "Father's Day"                      , nthDOWOfMonth 3 7 6,
+        "vatt?er( ?tag)?" )
+  ]
+
+ruleHolidays :: [Rule]
+ruleHolidays = map go holidays
+  where
+    go (name, date, regexPattern) = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt date
+      }
+
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
@@ -90,24 +194,6 @@
       _ -> Nothing
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "die?nstags?|di\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
-ruleValentinesDay :: Rule
-ruleValentinesDay = Rule
-  { name = "valentine's day"
-  , pattern =
-    [ regex "valentin'?stag"
-    ]
-  , prod = \_ -> tt $ monthDay 2 14
-  }
-
 ruleTheOrdinalCycleOfTime :: Rule
 ruleTheOrdinalCycleOfTime = Rule
   { name = "the <ordinal> <cycle> of <time>"
@@ -144,15 +230,6 @@
       _ -> Nothing
   }
 
-ruleNewYearsDay :: Rule
-ruleNewYearsDay = Rule
-  { name = "new year's day"
-  , pattern =
-    [ regex "neujahr(s?tag)?"
-    ]
-  , prod = \_ -> tt $ monthDay 1 1
-  }
-
 ruleLastTime :: Rule
 ruleLastTime = Rule
   { name = "last <time>"
@@ -166,15 +243,6 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "samstags?|sa\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -237,15 +305,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juli|jul\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleEvening :: Rule
 ruleEvening = Rule
   { name = "evening"
@@ -286,15 +345,6 @@
       _ -> Nothing
   }
 
-ruleNow :: Rule
-ruleNow = Rule
-  { name = "now"
-  , pattern =
-    [ regex "(genau)? ?jetzt|diesen moment|in diesem moment|gerade eben"
-    ]
-  , prod = \_ -> tt $ cycleNth TG.Second 0
-  }
-
 ruleLastCycleOfTime :: Rule
 ruleLastCycleOfTime = Rule
   { name = "last <cycle> of <time>"
@@ -394,24 +444,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "donn?erstags?|do\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
-ruleAfterTomorrow :: Rule
-ruleAfterTomorrow = Rule
-  { name = "after tomorrow"
-  , pattern =
-    [ regex "(\x00fc)bermorgen"
-    ]
-  , prod = \_ -> tt $ cycleNth TG.Day 2
-  }
-
 ruleTheCycleAfterTime :: Rule
 ruleTheCycleAfterTime = Rule
   { name = "the <cycle> after <time>"
@@ -442,18 +474,6 @@
       _ -> Nothing
   }
 
-ruleSeason4 :: Rule
-ruleSeason4 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "fr(\x00fc)hling|fr(\x00fc)hjahr"
-    ]
-  , 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)"
@@ -472,7 +492,7 @@
   { name = "<time> after next"
   , pattern =
     [ dimension Time
-    , regex "nach dem n(\x00e4)chsten"
+    , regex "nach dem n(ä)chsten"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -498,25 +518,16 @@
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "mittags?|zw(\x00f6)lf (uhr)?"
+    [ regex "mittags?|zw(ö)lf (uhr)?"
     ]
   , prod = \_ -> tt $ hour False 12
   }
 
-ruleToday :: Rule
-ruleToday = Rule
-  { name = "today"
-  , pattern =
-    [ regex "heute|(um diese zeit|zu dieser zeit|um diesen zeitpunkt|zu diesem zeitpunkt)"
-    ]
-  , prod = \_ -> tt $ cycleNth TG.Day 0
-  }
-
 ruleThisnextDayofweek :: Rule
 ruleThisnextDayofweek = Rule
   { name = "this|next <day-of-week>"
   , pattern =
-    [ regex "diese(n|r)|kommenden|n(\x00e4)chsten"
+    [ regex "diese(n|r)|kommenden|n(ä)chsten"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -544,7 +555,7 @@
 ruleNextCycle = Rule
   { name = "next <cycle>"
   , pattern =
-    [ regex "n(\x00e4)chste(r|n|s)?|kommende(r|n|s)?"
+    [ regex "n(ä)chste(r|n|s)?|kommende(r|n|s)?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -553,21 +564,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "januar|jan\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleTimeofdayApproximately :: Rule
 ruleTimeofdayApproximately = Rule
   { name = "<time-of-day> approximately"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(um )?zirka|ungef(\x00e4)hr|etwa"
+    , regex "(um )?zirka|ungef(ä)hr|etwa"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -586,15 +588,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "m(\x00e4)rz|m(\x00e4)r\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleDurationFromNow :: Rule
 ruleDurationFromNow = Rule
   { name = "<duration> from now"
@@ -647,15 +640,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "april|apr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleTimeBeforeLast :: Rule
 ruleTimeBeforeLast = Rule
   { name = "<time> before last"
@@ -681,20 +665,11 @@
       _ -> Nothing
   }
 
-ruleChristmasEve :: Rule
-ruleChristmasEve = Rule
-  { name = "christmas eve"
-  , pattern =
-    [ regex "heilig(er)? abend"
-    ]
-  , prod = \_ -> tt $ monthDay 12 24
-  }
-
 ruleInduringThePartofday :: Rule
 ruleInduringThePartofday = Rule
   { name = "in|during the <part-of-day>"
   , pattern =
-    [ regex "(in|an|am|w(\x00e4)h?rend)( der| dem| des)?"
+    [ regex "(in|an|am|w(ä)h?rend)( der| dem| des)?"
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -707,7 +682,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -745,15 +720,6 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "freitags?|fr\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -842,7 +808,7 @@
 ruleFromTimeofdayTimeofdayInterval = Rule
   { name = "from <time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ regex "(von|nach|ab|fr(\x00fc)hestens (um)?)"
+    [ regex "(von|nach|ab|fr(ü)hestens (um)?)"
     , Predicate isATimeOfDay
     , regex "((noch|aber|jedoch)? vor)|\\-|bis"
     , Predicate isATimeOfDay
@@ -853,20 +819,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "februar|feb\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleExactlyTimeofday :: Rule
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
   , pattern =
-    [ regex "genau|exakt|p(\x00fc)nktlich|punkt( um)?"
+    [ regex "genau|exakt|p(ü)nktlich|punkt( um)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -874,39 +831,6 @@
       _ -> Nothing
   }
 
-ruleSeason3 :: Rule
-ruleSeason3 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "winter"
-    ]
-  , 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 "sommer"
-    ]
-  , prod = \_ ->
-      let from = monthDay 6 21
-          to = monthDay 9 23
-      in Token Time <$> interval TTime.Open from to
-  }
-
-ruleSchweizerBundesfeiertag :: Rule
-ruleSchweizerBundesfeiertag = Rule
-  { name = "Schweizer Bundesfeiertag"
-  , pattern =
-    [ regex "schweiz(er)? (bundes)?feiertag|bundes feiertag"
-    ]
-  , prod = \_ -> tt $ monthDay 8 1
-  }
-
 ruleBetweenDatetimeAndDatetimeInterval :: Rule
 ruleBetweenDatetimeAndDatetimeInterval = Rule
   { name = "between <datetime> and <datetime> (interval)"
@@ -922,15 +846,6 @@
       _ -> Nothing
   }
 
-ruleNewYearsEve :: Rule
-ruleNewYearsEve = Rule
-  { name = "new year's eve"
-  , pattern =
-    [ regex "silvester"
-    ]
-  , prod = \_ -> tt $ monthDay 12 31
-  }
-
 ruleDurationAgo :: Rule
 ruleDurationAgo = Rule
   { name = "<duration> ago"
@@ -969,15 +884,6 @@
       Token Time . partOfDay <$> intersect td1 td2
   }
 
-ruleBeforeYesterday :: Rule
-ruleBeforeYesterday = Rule
-  { name = "before yesterday"
-  , pattern =
-    [ regex "vorgestern"
-    ]
-  , prod = \_ -> tt . cycleNth TG.Day $ - 2
-  }
-
 ruleLastNCycle :: Rule
 ruleLastNCycle = Rule
   { name = "last n <cycle>"
@@ -998,22 +904,13 @@
   { name = "<time-of-day> sharp"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "genau|exakt|p(\x00fc)nktlich|punkt( um)?"
+    , regex "genau|exakt|p(ü)nktlich|punkt( um)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
       _ -> Nothing
   }
 
-ruleAllerheiligen :: Rule
-ruleAllerheiligen = Rule
-  { name = "Allerheiligen"
-  , pattern =
-    [ regex "allerheiligen?|aller heiligen?"
-    ]
-  , prod = \_ -> tt $ monthDay 11 1
-  }
-
 ruleWithinDuration :: Rule
 ruleWithinDuration = Rule
   { name = "within <duration>"
@@ -1065,7 +962,7 @@
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "(um )?zirka|ca\\.?|ungef(\x00e4)hr|etwa|gegen"
+    [ regex "(um )?zirka|ca\\.?|ungef(ä)hr|etwa|gegen"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1077,7 +974,7 @@
 ruleUntilTimeofday = Rule
   { name = "until <time-of-day>"
   , pattern =
-    [ regex "vor|bis( zu[rm]?)?|sp(\x00e4)testens?"
+    [ regex "vor|bis( zu[rm]?)?|sp(ä)testens?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1090,22 +987,13 @@
   { name = "<time-of-day> until"
   , pattern =
     [ dimension Time
-    , regex "sp(\x00e4)testens"
+    , regex "sp(ä)testens"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_:_) -> tt $ withDirection TTime.Before td
       _ -> Nothing
   }
 
-ruleSterreichischerNationalfeiertag :: Rule
-ruleSterreichischerNationalfeiertag = Rule
-  { name = "Österreichischer Nationalfeiertag"
-  , pattern =
-    [ regex "((\x00f6)sterreichischer?)? nationalfeiertag|national feiertag"
-    ]
-  , prod = \_ -> tt $ monthDay 10 26
-  }
-
 ruleAtTimeofday :: Rule
 ruleAtTimeofday = Rule
   { name = "at <time-of-day>"
@@ -1118,15 +1006,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juni|jun\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -1145,15 +1024,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "august|aug\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -1173,28 +1043,7 @@
   , pattern =
     [ regex "wochen ?ende?"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
-  }
-
-ruleTagDerDeutschenEinheit :: Rule
-ruleTagDerDeutschenEinheit = Rule
-  { name = "Tag der Deutschen Einheit"
-  , pattern =
-    [ regex "tag (der)? deutsc?hen? einheit"
-    ]
-  , prod = \_ -> tt $ monthDay 10 3
-  }
-
-ruleEomendOfMonth :: Rule
-ruleEomendOfMonth = Rule
-  { name = "EOM|End of month"
-  , pattern =
-    [ regex "(das )?ende des monats?"
-    ]
-  , prod = \_ -> tt $ cycleNth TG.Month 1
+  , prod = \_ -> tt weekend
   }
 
 ruleNthTimeAfterTime2 :: Rule
@@ -1221,8 +1070,8 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "(n(\x00e4)chste|kommende)[ns]?"
-    , dimension Time
+    [ regex "(n(ä)chste|kommende)[ns]?"
+    , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -1293,7 +1142,7 @@
 ruleNextNCycle = Rule
   { name = "next n <cycle>"
   , pattern =
-    [ regex "n(\x00e4)chsten?|kommenden?"
+    [ regex "n(ä)chsten?|kommenden?"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -1321,7 +1170,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "morgens|(in der )?fr(\x00fc)h|vor ?mittags?|am morgen"
+    [ regex "morgens|(in der )?fr(ü)h|vor ?mittags?|am morgen"
     ]
   , prod = \_ ->
       let from = hour False 3
@@ -1395,15 +1244,6 @@
       _ -> Nothing
   }
 
-ruleNikolaus :: Rule
-ruleNikolaus = Rule
-  { name = "Nikolaus"
-  , pattern =
-    [ regex "nikolaus(tag)?|nikolaus tag|nikolo"
-    ]
-  , prod = \_ -> tt $ monthDay 12 6
-  }
-
 ruleAfterLunch :: Rule
 ruleAfterLunch = Rule
   { name = "after lunch"
@@ -1433,7 +1273,7 @@
   { name = "year (latent)"
   , pattern =
     [ Predicate $
-        liftM2 (||) (isIntegerBetween (- 10000) 0) (isIntegerBetween 25 999)
+        or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -1442,32 +1282,11 @@
       _ -> Nothing
   }
 
-ruleYesterday :: Rule
-ruleYesterday = Rule
-  { name = "yesterday"
-  , pattern =
-    [ regex "gestern"
-    ]
-  , prod = \_ -> tt . cycleNth TG.Day $ - 1
-  }
-
-ruleSeason2 :: Rule
-ruleSeason2 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "herbst"
-    ]
-  , prod = \_ ->
-      let from = monthDay 9 23
-          to = monthDay 12 21
-      in Token Time <$> interval TTime.Open from to
-  }
-
 ruleAfterTimeofday :: Rule
 ruleAfterTimeofday = Rule
   { name = "after <time-of-day>"
   , pattern =
-    [ regex "nach|ab|fr(\x00fc)he?stens"
+    [ regex "nach|ab|fr(ü)he?stens"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1480,22 +1299,13 @@
   { name = "<time-of-day> after"
   , pattern =
     [ dimension Time
-    , regex "fr(\x00fc)he?stens"
+    , regex "fr(ü)he?stens"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_:_) -> tt $ withDirection TTime.After td
       _ -> Nothing
   }
 
-ruleChristmas :: Rule
-ruleChristmas = Rule
-  { name = "christmas"
-  , pattern =
-    [ regex "weih?nacht(en|stag)?"
-    ]
-  , prod = \_ -> tt $ monthDay 12 25
-  }
-
 ruleNight :: Rule
 ruleNight = Rule
   { name = "night"
@@ -1582,7 +1392,7 @@
 ruleAfterNextTime = Rule
   { name = "after next <time>"
   , pattern =
-    [ regex "(\x00fc)ber ?n(\x00e4)chste[ns]?"
+    [ regex "(ü)ber ?n(ä)chste[ns]?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1591,24 +1401,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mai"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "sonntags?|so\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleHhmm :: Rule
 ruleHhmm = Rule
   { name = "hh:mm"
@@ -1648,24 +1440,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "oktober|okt\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
-ruleHalloweenDay :: Rule
-ruleHalloweenDay = Rule
-  { name = "halloween day"
-  , pattern =
-    [ regex "hall?owe?en?"
-    ]
-  , prod = \_ -> tt $ monthDay 10 31
-  }
-
 ruleNamedmonthDayofmonthNonOrdinal :: Rule
 ruleNamedmonthDayofmonthNonOrdinal = Rule
   { name = "<named-month> <day-of-month> (non ordinal)"
@@ -1710,7 +1484,7 @@
   , pattern =
     [ regex "letzte(r|n|s)?"
     , Predicate isADayOfWeek
-    , regex "um|im"
+    , regex "[ui]m"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1719,15 +1493,6 @@
       _ -> Nothing
   }
 
-ruleFathersDay :: Rule
-ruleFathersDay = Rule
-  { name = "Father's Day"
-  , pattern =
-    [ regex "vatt?ertag|vatt?er (tag)?"
-    ]
-  , prod = \_ -> tt $ nthDOWOfMonth 2 7 6
-  }
-
 ruleHhmmMilitaryAmpm :: Rule
 ruleHhmmMilitaryAmpm = Rule
   { name = "hhmm (military) am|pm"
@@ -1748,7 +1513,7 @@
 ruleTimeofdayTimeofdayInterval = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\-|bis"
     , Predicate isATimeOfDay
     ]
@@ -1764,7 +1529,7 @@
   , pattern =
     [ Predicate isATimeOfDay
     , regex "\\-|/|bis"
-    , Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    , Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     ]
   , prod = \tokens -> case tokens of
       (Token Time td1:_:Token Time td2:_) ->
@@ -1772,15 +1537,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "november|nov\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleDurationAfterTime :: Rule
 ruleDurationAfterTime = Rule
   { name = "<duration> after <time>"
@@ -1808,15 +1564,6 @@
       _ -> Nothing
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mittwochs?|mi\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleTheDayofmonthOrdinal :: Rule
 ruleTheDayofmonthOrdinal = Rule
   { name = "the <day-of-month> (ordinal)"
@@ -1873,33 +1620,6 @@
       _ -> Nothing
   }
 
-ruleEoyendOfYear :: Rule
-ruleEoyendOfYear = Rule
-  { name = "EOY|End of year"
-  , pattern =
-    [ regex "(das )?(EOY|jahr(es)? ?ende|ende (des )?jahr(es)?)"
-    ]
-  , prod = \_ -> tt $ cycleNth TG.Year 1
-  }
-
-ruleTomorrow :: Rule
-ruleTomorrow = Rule
-  { name = "tomorrow"
-  , pattern =
-    [ regex "morgen"
-    ]
-  , prod = \_ -> tt $ cycleNth TG.Day 1
-  }
-
-ruleMothersDay :: Rule
-ruleMothersDay = Rule
-  { name = "Mother's Day"
-  , pattern =
-    [ regex "mutt?ertag|mutt?er (tag)?"
-    ]
-  , prod = \_ -> tt $ nthDOWOfMonth 1 7 5
-  }
-
 ruleTimeofdayOclock :: Rule
 ruleTimeofdayOclock = Rule
   { name = "<time-of-day>  o'clock"
@@ -1913,15 +1633,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "september|sept?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -1945,7 +1656,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1964,18 +1675,13 @@
   , ruleAfterLunch
   , ruleAfterNextTime
   , ruleAfterTimeofday
-  ,  ruleAfterTimeofdayPostfix
-  , ruleAfterTomorrow
+  , ruleAfterTimeofdayPostfix
   , ruleAfterWork
   , ruleAfternoon
-  , ruleAllerheiligen
   , ruleAtTimeofday
-  , ruleBeforeYesterday
   , ruleBetweenDatetimeAndDatetimeInterval
   , ruleBetweenTimeofdayAndTimeofdayInterval
   , ruleByTheEndOfTime
-  , ruleChristmas
-  , ruleChristmasEve
   , ruleDatetimeDatetimeInterval
   , ruleDateDateInterval
   , ruleDayofmonthNonOrdinalNamedmonth
@@ -1988,15 +1694,11 @@
   , ruleDurationBeforeTime
   , ruleDurationFromNow
   , ruleDurationHence
-  , ruleEomendOfMonth
-  , ruleEoyendOfYear
   , ruleEvening
   , ruleExactlyTimeofday
-  , ruleFathersDay
   , ruleFromDatetimeDatetimeInterval
   , ruleFromTimeofdayTimeofdayInterval
   , ruleHalfIntegerGermanStyleHourofday
-  , ruleHalloweenDay
   , ruleHhmm
   , ruleHhmmMilitary
   , ruleHhmmMilitaryAmpm
@@ -2017,37 +1719,13 @@
   , ruleMmddyyyy
   , ruleMonthDdddInterval
   , ruleMorning
-  , ruleMothersDay
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
-  , ruleNewYearsDay
-  , ruleNewYearsEve
   , ruleNextCycle
   , ruleNextNCycle
   , ruleNextTime
   , ruleNight
-  , ruleNikolaus
   , ruleNoon
-  , ruleNow
   , ruleNthTimeAfterTime
   , ruleNthTimeAfterTime2
   , ruleNthTimeOfTime
@@ -2061,13 +1739,6 @@
   , rulePartofdayOfTime
   , ruleRelativeMinutesAfterpastIntegerHourofday
   , ruleRelativeMinutesTotillbeforeIntegerHourofday
-  , ruleSchweizerBundesfeiertag
-  , ruleSeason
-  , ruleSeason2
-  , ruleSeason3
-  , ruleSeason4
-  , ruleSterreichischerNationalfeiertag
-  , ruleTagDerDeutschenEinheit
   , ruleTheCycleAfterTime
   , ruleTheCycleBeforeTime
   , ruleTheDayofmonthNonOrdinal
@@ -2089,18 +1760,14 @@
   , ruleTimeofdaySharp
   , ruleTimeofdayTimeofdayInterval
   , ruleTimeofdayTimeofdayInterval2
-  , ruleToday
-  , ruleTomorrow
   , ruleTonight
   , ruleUntilTimeofday
   , ruleUntilTimeofdayPostfix
-  , ruleValentinesDay
   , ruleWeekend
   , ruleWithinDuration
   , ruleYear
   , ruleYearLatent
   , ruleYearLatent2
-  , ruleYesterday
   , ruleYyyymmdd
   , ruleQuarterTotillbeforeIntegerHourofday
   , ruleHalfTotillbeforeIntegerHourofday
@@ -2110,3 +1777,8 @@
   , ruleHourofdayHalf
   , ruleTimezone
   ]
+  ++ ruleInstants
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
+  ++ ruleSeasons
+  ++ ruleHolidays
diff --git a/Duckling/Time/EN/CA/Corpus.hs b/Duckling/Time/EN/CA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/EN/CA/Corpus.hs
@@ -0,0 +1,60 @@
+-- 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.Time.EN.CA.Corpus
+  ( allExamples
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "2/15"
+             , "on 2/15"
+             , "2 / 15"
+             , "2-15"
+             , "2 - 15"
+             ]
+  , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
+             [ "10/31/1974"
+             , "10/31/74"
+             , "10-31-74"
+             ]
+  , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
+             [ "4/25 at 4:00pm"
+             ]
+  , examples (datetime (2013, 10, 14, 0, 0, 0) Day)
+             [ "thanksgiving day"
+             , "thanksgiving"
+             , "thanksgiving 2013"
+             , "this thanksgiving"
+             , "next thanksgiving day"
+             ]
+  , examples (datetime (2014, 10, 13, 0, 0, 0) Day)
+             [ "thanksgiving of next year"
+             , "thanksgiving 2014"
+             ]
+  , examples (datetime (2012, 10, 8, 0, 0, 0) Day)
+             [ "last thanksgiving"
+             , "thanksgiving day 2012"
+             ]
+  , examples (datetime (2016, 10, 10, 0, 0, 0) Day)
+             [ "thanksgiving 2016"
+             ]
+  , examples (datetime (2017, 10, 9, 0, 0, 0) Day)
+             [ "thanksgiving 2017"
+             ]
+  ]
diff --git a/Duckling/Time/EN/CA/Rules.hs b/Duckling/Time/EN/CA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/EN/CA/Rules.hs
@@ -0,0 +1,69 @@
+-- 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.Time.EN.CA.Rules
+  ( rules
+  ) where
+
+import Data.Maybe
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Regex.Types
+import Duckling.Time.Helpers
+import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+
+-- Although one can see both MMDD and DDMM in Canada,
+-- there is no direct way to implement this today. Let's fallback to MMDD (US).
+ruleMMDD :: Rule
+ruleMMDD = Rule
+  { name = "mm/dd"
+  , pattern = [regex "(0?[1-9]|1[0-2])\\s?[/-]\\s?(3[01]|[12]\\d|0?[1-9])"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (mm:dd:_)):_) -> do
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleMMDDYYYY :: Rule
+ruleMMDDYYYY = Rule
+  { name = "mm/dd/yyyy"
+  , pattern =
+    [regex "(0?[1-9]|1[0-2])[/-](3[01]|[12]\\d|0?[1-9])[-/](\\d{2,4})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (mm:dd:yy:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleThanksgiving :: Rule
+ruleThanksgiving = Rule
+  { name = "Thanksgiving Day"
+  , pattern =
+    [ regex "thanks?giving( day)?"
+    ]
+  , prod = \_ -> tt $ nthDOWOfMonth 2 1 10 -- Second Monday of October
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleMMDD
+  , ruleMMDDYYYY
+  , ruleThanksgiving
+  ]
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
@@ -10,6 +10,7 @@
 
 module Duckling.Time.EN.Corpus
   ( corpus
+  , defaultCorpus
   , negativeCorpus
   ) where
 
@@ -24,6 +25,48 @@
 corpus :: Corpus
 corpus = (testContext, allExamples)
 
+defaultCorpus :: Corpus
+defaultCorpus = (testContext, allExamples ++ custom)
+  where
+    custom = concat
+      [ examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+                 [ "2/15"
+                 , "on 2/15"
+                 , "2 / 15"
+                 , "2-15"
+                 , "2 - 15"
+                 ]
+      , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
+                 [ "10/31/1974"
+                 , "10/31/74"
+                 , "10-31-74"
+                 ]
+      , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
+                 [ "4/25 at 4:00pm"
+                 ]
+      , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+                 [ "thanksgiving day"
+                 , "thanksgiving"
+                 , "thanksgiving 2013"
+                 , "this thanksgiving"
+                 , "next thanksgiving day"
+                 ]
+      , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+                 [ "thanksgiving of next year"
+                 , "thanksgiving 2014"
+                 ]
+      , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+                 [ "last thanksgiving"
+                 , "thanksgiving day 2012"
+                 ]
+      , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+                 [ "thanksgiving 2016"
+                 ]
+      , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+                 [ "thanksgiving 2017"
+                 ]
+      ]
+
 negativeCorpus :: NegativeCorpus
 negativeCorpus = (testContext, examples)
   where
@@ -43,6 +86,10 @@
       , "at dozens"
       , "single o'clock"
       , "dozens o'clock"
+      , "Rat 6"
+      , "rat 6"
+      , "3 30"
+      , "three twenty"
       ]
 
 allExamples :: [Example]
@@ -60,7 +107,8 @@
              [ "2/2013"
              ]
   , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
-             ["yesterday"]
+             [ "yesterday"
+             ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
              [ "tomorrow"
              , "tomorrows"
@@ -106,9 +154,11 @@
              , "march first"
              ]
   , examples (datetime (2013, 3, 3, 0, 0, 0) Day)
-             ["march 3"]
+             [ "march 3"
+             ]
   , examples (datetime (2013, 3, 15, 0, 0, 0) Day)
-             ["the ides of march"]
+             [ "the ides of march"
+             ]
   , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
              [ "march 3 2015"
              , "march 3rd 2015"
@@ -125,25 +175,17 @@
              , "february the 15th"
              , "february 15"
              , "15th february"
-             , "2/15"
-             , "on 2/15"
              , "February 15"
-             , "2 / 15"
-             , "2-15"
-             , "2 - 15"
              ]
   , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
-             ["Aug 8"]
+             [ "Aug 8"
+             ]
   , examples (datetime (2014, 7, 18, 0, 0, 0) Day)
              [ "Fri, Jul 18"
              , "Jul 18, Fri"
              ]
   , examples (datetime (2014, 10, 1, 0, 0, 0) Month)
-             ["October 2014"]
-  , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
-             [ "10/31/1974"
-             , "10/31/74"
-             , "10-31-74"
+             [ "October 2014"
              ]
   , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
              [ "14april 2015"
@@ -155,15 +197,20 @@
              , "around next tuesday"
              ]
   , examples (datetime (2013, 2, 22, 0, 0, 0) Day)
-             ["friday after next"]
+             [ "friday after next"
+             ]
   , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
-             ["next March"]
+             [ "next March"
+             ]
   , examples (datetime (2014, 3, 1, 0, 0, 0) Month)
-             ["March after next"]
+             [ "March after next"
+             ]
   , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
-             ["Sunday, Feb 10"]
+             [ "Sunday, Feb 10"
+             ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
-             ["Wed, Feb13"]
+             [ "Wed, Feb13"
+             ]
   , examples (datetime (2013, 2, 11, 0, 0, 0) Week)
              [ "this week"
              , "current week"
@@ -180,9 +227,11 @@
              , "around next week"
              ]
   , examples (datetime (2013, 1, 1, 0, 0, 0) Month)
-             ["last month"]
+             [ "last month"
+             ]
   , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
-             ["next month"]
+             [ "next month"
+             ]
   , examples (datetime (2013, 1, 1, 0, 0, 0) Quarter)
              [ "this quarter"
              , "this qtr"
@@ -222,64 +271,84 @@
              , "last week's sunday"
              ]
   , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
-             ["last tuesday"]
+             [ "last tuesday"
+             ]
   , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
-             ["next tuesday"]
+             [ "next tuesday"
+             ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
-             ["next wednesday"]
+             [ "next wednesday"
+             ]
   , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
              [ "wednesday of next week"
              , "wednesday next week"
              , "wednesday after next"
              ]
   , examples (datetime (2013, 2, 22, 0, 0, 0) Day)
-             ["friday after next"]
+             [ "friday after next"
+             ]
   , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
-             ["monday of this week"]
+             [ "monday of this week"
+             ]
   , examples (datetime (2013, 2, 12, 0, 0, 0) Day)
-             ["tuesday of this week"]
+             [ "tuesday of this week"
+             ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
-             ["wednesday of this week"]
+             [ "wednesday of this week"
+             ]
   , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
-             ["the day after tomorrow"]
+             [ "the day after tomorrow"
+             ]
   , examples (datetime (2013, 2, 14, 17, 0, 0) Hour)
              [ "day after tomorrow 5pm"
              ]
   , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
-             ["the day before yesterday"]
+             [ "the day before yesterday"
+             ]
   , examples (datetime (2013, 2, 10, 8, 0, 0) Hour)
              [ "day before yesterday 8am"
              ]
   , examples (datetime (2013, 3, 25, 0, 0, 0) Day)
-             ["last Monday of March"]
+             [ "last Monday of March"
+             ]
   , examples (datetime (2014, 3, 30, 0, 0, 0) Day)
-             ["last Sunday of March 2014"]
+             [ "last Sunday of March 2014"
+             ]
   , examples (datetime (2013, 10, 3, 0, 0, 0) Day)
-             ["third day of october"]
+             [ "third day of october"
+             ]
   , examples (datetime (2014, 10, 6, 0, 0, 0) Week)
-             ["first week of october 2014"]
+             [ "first week of october 2014"
+             ]
   , examples (datetime (2013, 10, 7, 0, 0, 0) Week)
-             ["the week of october 6th"]
+             [ "the week of october 6th"
+             ]
   , examples (datetime (2013, 10, 7, 0, 0, 0) Week)
-             ["the week of october 7th"]
+             [ "the week of october 7th"
+             ]
   , examples (datetime (2015, 10, 31, 0, 0, 0) Day)
              [ "last day of october 2015"
              , "last day in october 2015"
              ]
   , examples (datetime (2014, 9, 22, 0, 0, 0) Week)
-             ["last week of september 2014"]
+             [ "last week of september 2014"
+             ]
   , examples (datetime (2013, 10, 1, 0, 0, 0) Day)
              [ "first tuesday of october"
              , "first tuesday in october"
              ]
   , examples (datetime (2014, 9, 16, 0, 0, 0) Day)
-             ["third tuesday of september 2014"]
+             [ "third tuesday of september 2014"
+             ]
   , examples (datetime (2014, 10, 1, 0, 0, 0) Day)
-             ["first wednesday of october 2014"]
+             [ "first wednesday of october 2014"
+             ]
   , examples (datetime (2014, 10, 8, 0, 0, 0) Day)
-             ["second wednesday of october 2014"]
+             [ "second wednesday of october 2014"
+             ]
   , examples (datetime (2015, 1, 13, 0, 0, 0) Day)
-             ["third tuesday after christmas 2014"]
+             [ "third tuesday after christmas 2014"
+             ]
   , examples (datetime (2013, 2, 13, 3, 0, 0) Hour)
              [ "at 3am"
              , "3 in the AM"
@@ -310,6 +379,7 @@
              , "3:15pm"
              , "3:15PM"
              , "3:15p"
+             , "at 3 15"
              ]
   , examples (datetime (2013, 2, 12, 15, 20, 0) Minute)
              [ "at 20 past 3pm"
@@ -317,6 +387,7 @@
              , "3:20 in afternoon"
              , "twenty after 3pm"
              , "3:20p"
+             , "at three twenty"
              ]
   , examples (datetime (2013, 2, 12, 15, 30, 0) Minute)
              [ "at half past three pm"
@@ -415,23 +486,31 @@
              , "in few hours"
              ]
   , examples (datetime (2013, 2, 13, 4, 30, 0) Minute)
-             ["in 24 hours"]
+             [ "in 24 hours"
+             ]
   , examples (datetime (2013, 2, 13, 4, 0, 0) Hour)
              [ "in a day"
              , "a day from now"
              ]
-  , examples (datetime (2016, 2, 1, 0, 0, 0) Month)
-             ["3 years from today"]
+  , examples (datetime (2013, 2, 13, 4, 30, 0) Second)
+             [ "a day from right now"
+             ]
+  , examples (datetime (2016, 2, 12, 0, 0, 0) Day)
+             [ "3 years from today"
+             ]
   , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
-             ["in 7 days"]
+             [ "in 7 days"
+             ]
   , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
              [ "in 1 week"
              , "in a week"
              ]
   , examples (datetime (2013, 2, 12, 5, 0, 0) Second)
-             ["in about half an hour"]
+             [ "in about half an hour"
+             ]
   , examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
-             ["7 days ago"]
+             [ "7 days ago"
+             ]
   , examples (datetime (2013, 1, 29, 4, 0, 0) Hour)
              [ "14 days Ago"
              , "a fortnight ago"
@@ -442,15 +521,20 @@
              , "1 week ago"
              ]
   , examples (datetime (2013, 1, 22, 0, 0, 0) Day)
-             ["three weeks ago"]
+             [ "three weeks ago"
+             ]
   , examples (datetime (2012, 11, 12, 0, 0, 0) Day)
-             ["three months ago"]
+             [ "three months ago"
+             ]
   , examples (datetime (2011, 2, 1, 0, 0, 0) Month)
-             ["two years ago"]
+             [ "two years ago"
+             ]
   , examples (datetime (1954, 1, 1, 0, 0, 0) Year)
-             ["1954"]
+             [ "1954"
+             ]
   , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
-             ["7 days hence"]
+             [ "7 days hence"
+             ]
   , examples (datetime (2013, 2, 26, 4, 0, 0) Hour)
              [ "14 days hence"
              , "a fortnight hence"
@@ -461,21 +545,28 @@
              , "1 week hence"
              ]
   , examples (datetime (2013, 3, 5, 0, 0, 0) Day)
-             ["three weeks hence"]
+             [ "three weeks hence"
+             ]
   , examples (datetime (2013, 5, 12, 0, 0, 0) Day)
-             ["three months hence"]
+             [ "three months hence"
+             ]
   , examples (datetime (2015, 2, 1, 0, 0, 0) Month)
-             ["two years hence"]
-  , examples (datetime (2013, 12, 1, 0, 0, 0) Month)
+             [ "two years hence"
+             ]
+  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
              [ "one year After christmas"
              , "a year from Christmas"
              ]
+  , examples (datetimeInterval ((2013, 12, 18, 0, 0, 0), (2013, 12, 29, 0, 0, 0)) Day)
+             [ "for 10 days from 18th Dec"
+             ]
   , examples (datetimeInterval ((2013, 6, 21, 0, 0, 0), (2013, 9, 24, 0, 0, 0)) Day)
              [ "this Summer"
              , "current summer"
              ]
   , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
-             ["this winter"]
+             [ "this winter"
+             ]
   , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
              [ "xmas"
              , "christmas"
@@ -498,15 +589,20 @@
              , "next mothers day"
              ]
   , examples (datetime (2012, 5, 13, 0, 0, 0) Day)
-             ["last mothers day"]
+             [ "last mothers day"
+             ]
   , examples (datetime (2014, 5, 11, 0, 0, 0) Day)
-             ["mothers day 2014"]
+             [ "mothers day 2014"
+             ]
   , examples (datetime (2013, 6, 16, 0, 0, 0) Day)
-             ["Father's Day"]
+             [ "Father's Day"
+             ]
   , examples (datetime (2012, 6, 17, 0, 0, 0) Day)
-             ["last fathers day"]
+             [ "last fathers day"
+             ]
   , examples (datetime (1996, 6, 16, 0, 0, 0) Day)
-             ["fathers day 1996"]
+             [ "fathers day 1996"
+             ]
   , examples (datetime (2013, 5, 27, 0, 0, 0) Day)
              [ "memorial day"
              , "Next Memorial Day"
@@ -516,43 +612,36 @@
              , "memorial day of last year"
              ]
   , examples (datetimeInterval ((2013, 5, 24, 18, 0, 0), (2013, 5, 28, 0, 0, 0)) Hour)
-             ["memorial day week-end"]
+             [ "memorial day week-end"
+             ]
   , examples (datetime (2013, 7, 4, 0, 0, 0) Day)
              [ "independence day"
              , "4th of July"
              , "4 of july"
              ]
   , examples (datetime (2013, 9, 2, 0, 0, 0) Day)
-             ["labor 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"]
+             [ "labor day weekend"
+             ]
   , examples (datetime (2013, 10, 31, 0, 0, 0) Day)
              [ "halloween"
              , "next halloween"
              , "Halloween 2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
-             [ "thanksgiving day"
-             , "thanksgiving"
-             , "thanksgiving 2013"
-             , "this thanksgiving"
-             , "next thanksgiving day"
-             ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
-             [ "thanksgiving of next year"
-             , "thanksgiving 2014"
+  , examples (datetime (2013, 11, 29, 0, 0, 0) Day)
+             [ "black friday"
+             , "black friday of this year"
+             , "black friday 2013"
              ]
-  {- FIXME (jodent) Doesn't work in Duckling either. t13908315
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
-             [ "last thanksgiving"
-             , "thanksgiving day 2012"
+  , examples (datetime (2017, 11, 24, 0, 0, 0) Day)
+             [ "black friday 2017"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
-             ["thanksgiving 2016"]-}
   , examples (datetime (2014, 1, 20, 0, 0, 0) Day)
              [ "MLK day"
              , "next Martin Luther King day"
@@ -572,19 +661,24 @@
              , "tonight"
              ]
   , examples (datetimeInterval ((2013, 2, 8, 18, 0, 0), (2013, 2, 11, 0, 0, 0)) Hour)
-             ["this past weekend"]
+             [ "this past weekend"
+             ]
   , examples (datetimeInterval ((2013, 2, 13, 18, 0, 0), (2013, 2, 14, 0, 0, 0)) Hour)
-             ["tomorrow evening"]
+             [ "tomorrow evening"
+             ]
   , examples (datetimeInterval ((2013, 2, 13, 12, 0, 0), (2013, 2, 13, 14, 0, 0)) Hour)
              [ "tomorrow lunch"
              , "tomorrow at lunch"
              ]
   , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
-             ["yesterday evening"]
+             [ "yesterday evening"
+             ]
   , examples (datetimeInterval ((2013, 2, 15, 18, 0, 0), (2013, 2, 18, 0, 0, 0)) Hour)
-             ["this week-end"]
+             [ "this week-end"
+             ]
   , examples (datetimeInterval ((2013, 2, 18, 4, 0, 0), (2013, 2, 18, 12, 0, 0)) Hour)
-             ["monday mOrnIng"]
+             [ "monday mOrnIng"
+             ]
   , examples (datetimeInterval ((2013, 2, 18, 4, 0, 0), (2013, 2, 18, 9, 0, 0)) Hour)
              [ "monday early in the morning"
              , "monday early morning"
@@ -629,7 +723,8 @@
              , "next three days"
              ]
   , examples (datetimeInterval ((2013, 2, 13, 0, 0, 0), (2013, 2, 16, 0, 0, 0)) Day)
-             ["next few days"]
+             [ "next few days"
+             ]
   , examples (datetimeInterval ((2013, 1, 28, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Week)
              [ "last 2 weeks"
              , "last two weeks"
@@ -662,6 +757,8 @@
              , "July 13 through 15"
              , "July 13 - July 15"
              , "from July 13-15"
+             , "from 13 to 15 July"
+             , "from 13th to 15th July"
              ]
   , examples (datetimeInterval ((2013, 8, 8, 0, 0, 0), (2013, 8, 13, 0, 0, 0)) Day)
              [ "Aug 8 - Aug 12"
@@ -701,19 +798,26 @@
              , "this Thu 9-11am"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 11, 30, 0), (2013, 2, 12, 13, 31, 0)) Minute)
-             ["11:30-1:30"]
+             [ "11:30-1:30"
+             ]
   , examples (datetime (2013, 9, 21, 13, 30, 0) Minute)
-             ["1:30 PM on Sat, Sep 21"]
+             [ "1:30 PM on Sat, Sep 21"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 26, 0, 0, 0)) Second)
-             ["Within 2 weeks"]
+             [ "Within 2 weeks"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 12, 14, 0, 0)) Second)
-             ["by 2:00pm"]
+             [ "by 2:00pm"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 2, 13, 0, 0, 0)) Second)
-             ["by EOD"]
+             [ "by EOD"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 3, 1, 0, 0, 0)) Second)
-             ["by EOM"]
+             [ "by EOM"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 4, 1, 0, 0, 0)) Second)
-             ["by the end of next month"]
+             [ "by the end of next month"
+             ]
   , examples (datetime (2013, 2, 12, 13, 0, 0) Minute)
              [ "4pm CET"
              ]
@@ -725,8 +829,6 @@
              [ "today at 2pm"
              , "at 2pm"
              ]
-  , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
-             ["4/25 at 4:00pm"]
   , examples (datetime (2013, 2, 13, 15, 0, 0) Hour)
              [ "3pm tomorrow"
              ]
@@ -735,13 +837,17 @@
              , "through 2:00pm"
              ]
   , examples (datetimeOpenInterval After (2013, 2, 12, 14, 0, 0) Hour)
-             ["after 2 pm"]
+             [ "after 2 pm"
+             ]
   , examples (datetimeOpenInterval After (2013, 2, 17, 4, 0, 0) Hour)
-             ["after 5 days"]
+             [ "after 5 days"
+             ]
   , examples (datetimeOpenInterval Before (2013, 2, 12, 11, 0, 0) Hour)
-             ["before 11 am"]
+             [ "before 11 am"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
-             ["in the afternoon"]
+             [ "in the afternoon"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 8, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
              [ "8am until 6"
              ]
@@ -755,7 +861,8 @@
              , "in 15"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 13, 0, 0), (2013, 2, 12, 17, 0, 0)) Hour)
-             ["after lunch"]
+             [ "after lunch"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 15, 0, 0), (2013, 2, 12, 21, 0, 0)) Hour)
              [ "after school"
              ]
@@ -764,9 +871,11 @@
              , "approximately 1030"
              ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
-             ["this morning"]
+             [ "this morning"
+             ]
   , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
-             ["next monday"]
+             [ "next monday"
+             ]
   , examples (datetime (2013, 2, 12, 12, 0, 0) Hour)
              [ "at 12pm"
              , "at noon"
@@ -833,5 +942,21 @@
              ]
   , examples (datetimeInterval ((2017, 10, 27, 18, 0, 0), (2017, 10, 30, 0, 0, 0)) Hour)
              [ "last weekend of October 2017"
+             ]
+  , examples (datetimeInterval ((2013, 8, 27, 0, 0, 0), (2013, 8, 30, 0, 0, 0)) Day)
+             [ "August 27th - 29th"
+             , "from August 27th - 29th"
+             ]
+  , examples (datetimeInterval ((2013, 10, 23, 0, 0, 0), (2013, 10, 27, 0, 0, 0)) Day)
+             [ "23rd to 26th Oct"
+             ]
+  , examples (datetimeInterval ((2013, 9, 1, 0, 0, 0), (2013, 9, 9, 0, 0, 0)) Day)
+             [ "1-8 september"
+             ]
+  , examples (datetimeInterval ((2013, 9, 12, 0, 0, 0), (2013, 9, 17, 0, 0, 0)) Day)
+             [ "12 to 16 september"
+             ]
+  , examples (datetimeInterval ((2013, 8, 19, 0, 0, 0), (2013, 8, 22, 0, 0, 0)) Day)
+             [ "19th To 21st aug"
              ]
   ]
diff --git a/Duckling/Time/EN/GB/Corpus.hs b/Duckling/Time/EN/GB/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/EN/GB/Corpus.hs
@@ -0,0 +1,60 @@
+-- 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.Time.EN.GB.Corpus
+  ( allExamples
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "15/2"
+             , "on 15/2"
+             , "15 / 2"
+             , "15-2"
+             , "15 - 2"
+             ]
+  , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
+             [ "31/10/1974"
+             , "31/10/74"
+             , "31-10-74"
+             ]
+  , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
+             [ "25/4 at 4:00pm"
+             ]
+  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+             [ "thanksgiving day"
+             , "thanksgiving"
+             , "thanksgiving 2013"
+             , "this thanksgiving"
+             , "next thanksgiving day"
+             ]
+  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+             [ "thanksgiving of next year"
+             , "thanksgiving 2014"
+             ]
+  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+             [ "last thanksgiving"
+             , "thanksgiving day 2012"
+             ]
+  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+             [ "thanksgiving 2016"
+             ]
+  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+             [ "thanksgiving 2017"
+             ]
+  ]
diff --git a/Duckling/Time/EN/GB/Rules.hs b/Duckling/Time/EN/GB/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/EN/GB/Rules.hs
@@ -0,0 +1,70 @@
+-- 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.Time.EN.GB.Rules
+  ( rules
+  ) where
+
+import Data.Maybe
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Regex.Types
+import Duckling.Time.Helpers
+import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+
+ruleDDMM :: Rule
+ruleDDMM = Rule
+  { name = "dd/mm"
+  , pattern =
+    [ regex "(3[01]|[12]\\d|0?[1-9])\\s?[/-]\\s?(0?[1-9]|1[0-2])"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do
+        d <- parseInt dd
+        m <- parseInt mm
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleDDMMYYYY :: Rule
+ruleDDMMYYYY = Rule
+  { name = "dd/mm/yyyy"
+  , pattern =
+    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](0?[1-9]|1[0-2])[-/](\\d{2,4})"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
+        y <- parseInt yy
+        d <- parseInt dd
+        m <- parseInt mm
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleThanksgiving :: Rule
+ruleThanksgiving = Rule
+  { name = "Thanksgiving Day"
+  , pattern =
+    [ regex "thanks?giving( day)?"
+    ]
+  , prod = \_ -> tt $ nthDOWOfMonth 4 4 11 -- Fourth Thursday of November
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDDMM
+  , ruleDDMMYYYY
+  , ruleThanksgiving
+  ]
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
@@ -13,7 +13,6 @@
 module Duckling.Time.EN.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
 import Data.Maybe
 import Data.Text (Text)
 import Prelude
@@ -108,7 +107,7 @@
 
 instants :: [(Text, String, TG.Grain, Int)]
 instants =
-  [ ("now", "((just|right)\\s*)?now|immediately", TG.Second, 0)
+  [ ("right now", "((just|right)\\s*)now|immediately", TG.Second, 0)
   , ("today", "todays?|(at this time)", TG.Day, 0)
   , ("tomorrow", "(tmrw?|tomm?or?rows?)", TG.Day, 1)
   , ("yesterday", "yesterdays?", TG.Day, - 1)
@@ -125,6 +124,15 @@
       , prod = \_ -> tt $ cycleNth grain n
       }
 
+ruleNow :: Rule
+ruleNow = Rule
+  { name = "now"
+  , pattern =
+    [ regex "now"
+    ]
+  , prod = \_ -> tt now
+  }
+
 ruleNextDOW :: Rule
 ruleNextDOW = Rule
   { name = "this|next <day-of-week>"
@@ -306,7 +314,7 @@
  { name = "past year (latent)"
  , pattern =
    [ Predicate $
-       liftM2 (||) (isIntegerBetween (- 10000) 0) (isIntegerBetween 25 999)
+       or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
    ]
  , prod = \tokens -> case tokens of
      (token:_) -> do
@@ -369,7 +377,7 @@
 ruleNamedDOMOrdinal = Rule
   { name = "<named-month>|<named-day> <day-of-month> (ordinal)"
   , pattern =
-    [ Predicate $ liftM2 (||) isAMonth isADayOfWeek
+    [ Predicate $ or . sequence [isAMonth, isADayOfWeek]
     , Predicate isDOMOrdinal
     ]
   , prod = \tokens -> case tokens of
@@ -448,7 +456,7 @@
 ruleTODLatent = Rule
   { name = "time-of-day (latent)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isNumeralSafeToUse (isIntegerBetween 0 23)
+    [ Predicate $ and . sequence [isNumeralSafeToUse, isIntegerBetween 0 23]
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -553,7 +561,7 @@
 ruleHONumeral = Rule
   { name = "<hour-of-day> <integer>"
   , pattern =
-    [ Predicate $ liftM2 (&&) isNotLatent isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -697,20 +705,6 @@
       _ -> Nothing
   }
 
-ruleMMDDYYYY :: Rule
-ruleMMDDYYYY = Rule
-  { name = "mm/dd/yyyy"
-  , pattern =
-    [regex "(0?[1-9]|1[0-2])[/-](3[01]|[12]\\d|0?[1-9])[-/](\\d{2,4})"]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (mm:dd:yy:_)):_) -> do
-        y <- parseInt yy
-        m <- parseInt mm
-        d <- parseInt dd
-        tt $ yearMonthDay y m d
-      _ -> Nothing
-  }
-
 ruleYYYYMMDD :: Rule
 ruleYYYYMMDD = Rule
   { name = "yyyy-mm-dd"
@@ -724,18 +718,6 @@
       _ -> Nothing
   }
 
-ruleMMDD :: Rule
-ruleMMDD = Rule
-  { name = "mm/dd"
-  , pattern = [regex "(0?[1-9]|1[0-2])\\s?[/-]\\s?(3[01]|[12]\\d|0?[1-9])"]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (mm:dd:_)):_) -> do
-        m <- parseInt mm
-        d <- parseInt dd
-        tt $ monthDay m d
-      _ -> Nothing
-  }
-
 ruleNoonMidnightEOD :: Rule
 ruleNoonMidnightEOD = Rule
   { name = "noon|midnight|EOD|end of day"
@@ -804,7 +786,7 @@
 ruleTonight :: Rule
 ruleTonight = Rule
   { name = "tonight"
-  , pattern = [regex "toni(ght|gth|te)"]
+  , 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)
@@ -860,7 +842,7 @@
 ruleWeekend = Rule
   { name = "week-end"
   , pattern =
-    [ regex "(week(\\s|-)?end|wkend)"
+    [ regex "(week(\\s|-)?end|wkend)s?"
     ]
   , prod = \_ -> tt weekend
   }
@@ -919,49 +901,89 @@
   { name = "<month> dd-dd (interval)"
   , pattern =
     [ Predicate isAMonth
-    , regex "(3[01]|[12]\\d|0?[1-9])"
+    , Predicate isDOMValue
     , regex "\\-|to|th?ru|through|(un)?til(l)?"
-    , regex "(3[01]|[12]\\d|0?[1-9])"
+    , Predicate isDOMValue
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:
-       Token RegexMatch (GroupMatch (d1:_)):
+       token1:
        _:
-       Token RegexMatch (GroupMatch (d2:_)):
+       token2:
        _) -> do
-        dd1 <- parseInt d1
-        dd2 <- parseInt d2
-        dom1 <- intersect (dayOfMonth dd1) td
-        dom2 <- intersect (dayOfMonth dd2) td
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
         Token Time <$> interval TTime.Closed dom1 dom2
       _ -> Nothing
   }
 
+ruleIntervalDDDDMonth :: Rule
+ruleIntervalDDDDMonth = Rule
+  { name = "dd-dd <month> (interval)"
+  , pattern =
+    [ Predicate isDOMValue
+    , regex "\\-|to|th?ru|through|(un)?til(l)?"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \tokens -> case tokens of
+      (token1:
+       _:
+       token2:
+       Token Time td:
+       _) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
 ruleIntervalFromMonthDDDD :: Rule
 ruleIntervalFromMonthDDDD = Rule
   { name = "from <month> dd-dd (interval)"
   , pattern =
     [ regex "from"
     , Predicate isAMonth
-    , regex "(3[01]|[12]\\d|0?[1-9])"
+    , Predicate isDOMValue
     , regex "\\-|to|th?ru|through|(un)?til(l)?"
-    , regex "(3[01]|[12]\\d|0?[1-9])"
+    , Predicate isDOMValue
     ]
   , prod = \tokens -> case tokens of
       (_:
        Token Time td:
-       Token RegexMatch (GroupMatch (d1:_)):
+       token1:
        _:
-       Token RegexMatch (GroupMatch (d2:_)):
+       token2:
        _) -> do
-        dd1 <- parseInt d1
-        dd2 <- parseInt d2
-        dom1 <- intersect (dayOfMonth dd1) td
-        dom2 <- intersect (dayOfMonth dd2) td
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
         Token Time <$> interval TTime.Closed dom1 dom2
       _ -> Nothing
   }
 
+ruleIntervalFromDDDDMonth :: Rule
+ruleIntervalFromDDDDMonth = Rule
+  { name = "from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)"
+  , pattern =
+    [ regex "from"
+    , Predicate isDOMValue
+    , regex "\\-|to|th?ru|through|(un)?til(l)?"
+    , Predicate isDOMValue
+    , Predicate isAMonth
+    ]
+  , prod = \tokens -> case tokens of
+      (_:
+       token1:
+       _:
+       token2:
+       Token Time td:
+       _) -> do
+        dom1 <- intersectDOM td token1
+        dom2 <- intersectDOM td token2
+        Token Time <$> interval TTime.Closed dom1 dom2
+      _ -> Nothing
+  }
+
 -- Blocked for :latent time. May need to accept certain latents only, like hours
 ruleIntervalDash :: Rule
 ruleIntervalDash = Rule
@@ -1012,7 +1034,7 @@
 ruleIntervalTODDash = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isNotLatent isATimeOfDay
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\-|:|to|th?ru|through|(un)?til(l)?"
     , Predicate isATimeOfDay
     ]
@@ -1236,19 +1258,11 @@
     )
   , ( "Father's Day" -- Third Sunday of June
     , "father'?s?'? day"
-    , 2, 7, 6
+    , 3, 7, 6
     )
   , ( "Mother's Day" -- Second Sunday of May
     , "mother'?s?'? day"
-    , 1, 7, 5
-    )
-  , ( "Thanksgiving Day" -- Fourth Thursday of November
-    , "thanks?giving( day)?"
-    , 4, 4, 11
-    )
-  , ( "Black Friday" -- Fourth Friday of November
-    , "black frid?day"
-    , 4, 5, 11
+    , 2, 7, 5
     )
   ,  ( "Labor Day" -- First Monday of September
      , "labor day"
@@ -1265,6 +1279,16 @@
       , prod = \_ -> tt $ nthDOWOfMonth n dow m
       }
 
+-- The day after Thanksgiving (not always the fourth Friday of November)
+ruleBlackFriday :: Rule
+ruleBlackFriday = Rule
+  { name = "black friday"
+  , pattern =
+    [ regex "black frid?day"
+    ]
+  , prod = \_ -> tt . cycleNthAfter False TG.Day 1 $ nthDOWOfMonth 4 4 11
+  }
+
 -- Last Monday of May
 ruleMemorialDay :: Rule
 ruleMemorialDay = Rule
@@ -1277,7 +1301,7 @@
 ruleMemorialDayWeekend :: Rule
 ruleMemorialDayWeekend = Rule
   { name = "Memorial Day Weekend"
-  , pattern = [regex "memorial day week(\\s|-)?end"]
+  , pattern = [regex "memorial day week(\\s|-)?ends?"]
   , prod = \_ ->
       tt . longWEBefore $ predLastOf (dayOfWeek 1) (month 5)
   }
@@ -1286,7 +1310,7 @@
 ruleLaborDayWeekend :: Rule
 ruleLaborDayWeekend = Rule
   { name = "Labor Day weekend"
-  , pattern = [regex "labor day week(\\s|-)?end"]
+  , pattern = [regex "labor day week(\\s|-)?ends?"]
   , prod = \_ -> tt . longWEBefore $ nthDOWOfMonth 1 1 9
   }
 
@@ -1555,11 +1579,26 @@
       _ -> Nothing
   }
 
+ruleIntervalForDurationFrom :: Rule
+ruleIntervalForDurationFrom = Rule
+  { name = "for <duration> from <time>"
+  , pattern =
+    [ regex "for"
+    , dimension Duration
+    , regex "(from|starting|beginning|after|starting from)"
+    , dimension Time
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Duration dd:_:Token Time td1:_) ->
+        Token Time <$> interval TTime.Open td1 (durationAfter dd td1)
+      _ -> Nothing
+}
+
 ruleTimezone :: Rule
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1619,9 +1658,7 @@
   , ruleHalfAfterHOD
   , ruleQuarterAfterHOD
   , ruleHalfHOD
-  , ruleMMDDYYYY
   , ruleYYYYMMDD
-  , ruleMMDD
   , ruleMMYYYY
   , ruleNoonMidnightEOD
   , rulePartOfDays
@@ -1637,7 +1674,9 @@
   , ruleTODPrecision
   , rulePrecisionTOD
   , ruleIntervalFromMonthDDDD
+  , ruleIntervalFromDDDDMonth
   , ruleIntervalMonthDDDD
+  , ruleIntervalDDDDMonth
   , ruleIntervalDash
   , ruleIntervalFrom
   , ruleIntervalBetween
@@ -1668,9 +1707,12 @@
   , ruleDurationInWithinAfter
   , ruleDurationHenceAgo
   , ruleDurationAfterBeforeTime
+  , ruleIntervalForDurationFrom
   , ruleInNumeral
   , ruleTimezone
   , rulePartOfMonth
+  , ruleNow
+  , ruleBlackFriday
   ]
   ++ ruleInstants
   ++ ruleDaysOfWeek
diff --git a/Duckling/Time/EN/US/Corpus.hs b/Duckling/Time/EN/US/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/EN/US/Corpus.hs
@@ -0,0 +1,60 @@
+-- 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.Time.EN.US.Corpus
+  ( allExamples
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 2, 15, 0, 0, 0) Day)
+             [ "2/15"
+             , "on 2/15"
+             , "2 / 15"
+             , "2-15"
+             , "2 - 15"
+             ]
+  , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
+             [ "10/31/1974"
+             , "10/31/74"
+             , "10-31-74"
+             ]
+  , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
+             [ "4/25 at 4:00pm"
+             ]
+  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+             [ "thanksgiving day"
+             , "thanksgiving"
+             , "thanksgiving 2013"
+             , "this thanksgiving"
+             , "next thanksgiving day"
+             ]
+  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+             [ "thanksgiving of next year"
+             , "thanksgiving 2014"
+             ]
+  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+             [ "last thanksgiving"
+             , "thanksgiving day 2012"
+             ]
+  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+             [ "thanksgiving 2016"
+             ]
+  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+             [ "thanksgiving 2017"
+             ]
+  ]
diff --git a/Duckling/Time/EN/US/Rules.hs b/Duckling/Time/EN/US/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/EN/US/Rules.hs
@@ -0,0 +1,70 @@
+-- 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.Time.EN.US.Rules
+  ( rules
+  , ruleMMDD
+  , ruleMMDDYYYY
+  , ruleThanksgiving
+  ) where
+
+import Data.Maybe
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Regex.Types
+import Duckling.Time.Helpers
+import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+
+ruleMMDD :: Rule
+ruleMMDD = Rule
+  { name = "mm/dd"
+  , pattern = [regex "(0?[1-9]|1[0-2])\\s?[/-]\\s?(3[01]|[12]\\d|0?[1-9])"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (mm:dd:_)):_) -> do
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+ruleMMDDYYYY :: Rule
+ruleMMDDYYYY = Rule
+  { name = "mm/dd/yyyy"
+  , pattern =
+    [regex "(0?[1-9]|1[0-2])[/-](3[01]|[12]\\d|0?[1-9])[-/](\\d{2,4})"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (mm:dd:yy:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleThanksgiving :: Rule
+ruleThanksgiving = Rule
+  { name = "Thanksgiving Day"
+  , pattern =
+    [ regex "thanks?giving( day)?"
+    ]
+  , prod = \_ -> tt $ nthDOWOfMonth 4 4 11 -- Fourth Thursday of November
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleMMDD
+  , ruleMMDDYYYY
+  , ruleThanksgiving
+  ]
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
@@ -9,19 +9,20 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.ES.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.TimeGrain.Types hiding (add)
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = ES}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, 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
@@ -13,35 +13,25 @@
 module Duckling.Time.ES.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
-import qualified Data.Text as Text
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData (..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "lunes|lun?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
-
 ruleTheDayAfterTomorrow :: Rule
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow"
   , pattern =
-    [ regex "pasado\\s?ma(n|\x00f1)ana"
+    [ regex "pasado\\s?ma(n|ñ)ana"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
@@ -59,15 +49,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "diciembre|dic\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleCeTime :: Rule
 ruleCeTime = Rule
   { name = "ce <time>"
@@ -81,15 +62,51 @@
       _ -> Nothing
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "martes|mar?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
+daysOfWeek :: [(Text.Text, String)]
+daysOfWeek =
+  [ ( "Lunes"     , "lunes|lun?\\.?"                        )
+  , ( "Martes"    , "martes|mar?\\.?"                       )
+  , ( "Miercoles" , "mi(e|é)\\.?(rcoles)?|mx|mier?\\." )
+  , ( "Jueves"    , "jueves|jue|jue\\."                     )
+  , ( "Viernes"   , "viernes|vie|vie\\."                    )
+  , ( "Sabado"    , "s(á|a)bado|s(á|a)b\\.?"      )
+  , ( "Domingo"   , "domingo|dom\\.?"                       )
+  ]
 
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text.Text, String)]
+months =
+  [ ( "Enero"     , "enero|ene\\.?")
+  , ( "Febrero"   , "febrero|feb\\.?")
+  , ( "Marzo"     , "marzo|mar\\.?")
+  , ( "Abril"     , "abril|abr\\.?")
+  , ( "Mayo"      , "mayo?\\.?")
+  , ( "Junio"     , "junio|jun\\.?")
+  , ( "Julio"     , "julio|jul\\.?")
+  , ( "Agosto"    , "agosto|ago\\.?")
+  , ( "Septiembre", "septiembre|sept?\\.?")
+  , ( "Octubre"   , "octubre|oct\\.?")
+  , ( "Noviembre" , "noviembre|nov\\.?")
+  , ( "Diciembre" , "diciembre|dic\\.?")
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleThisDayofweek :: Rule
 ruleThisDayofweek = Rule
   { name = "this <day-of-week>"
@@ -103,15 +120,6 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "s(\x00e1|a)bado|s(\x00e1|a)b\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -126,15 +134,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "julio|jul\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleEvening :: Rule
 ruleEvening = Rule
   { name = "evening"
@@ -183,7 +182,7 @@
 ruleUltimoDayofweekDeTime = Rule
   { name = "ultimo <day-of-week> de <time>"
   , pattern =
-    [ regex "(\x00fa|u)ltimo"
+    [ regex "(ú|u)ltimo"
     , Predicate isADayOfWeek
     , regex "de|en"
     , dimension Time
@@ -223,15 +222,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "jueves|jue|jue\\."
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleElDayofmonthDeNamedmonth :: Rule
 ruleElDayofmonthDeNamedmonth = Rule
   { name = "el <day-of-month> de <named-month>"
@@ -266,7 +256,7 @@
   { name = "el proximo <cycle> "
   , pattern =
     [ regex "(el|los|la|las) ?"
-    , regex "pr(\x00f3|o)xim(o|a)s?|siguientes?"
+    , regex "pr(ó|o)xim(o|a)s?|siguientes?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -333,7 +323,7 @@
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "mediod(\x00ed|i)a"
+    [ regex "mediod(í|i)a"
     ]
   , prod = \_ -> tt $ hour False 12
   }
@@ -342,7 +332,7 @@
 ruleProximasNCycle = Rule
   { name = "proximas n <cycle>"
   , pattern =
-    [ regex "pr(\x00f3|o)xim(o|a)s?"
+    [ regex "pr(ó|o)xim(o|a)s?"
     , Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
     ]
@@ -450,7 +440,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -594,15 +584,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "enero|ene\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleInThePartofday :: Rule
 ruleInThePartofday = Rule
   { name = "in the <part-of-day>"
@@ -620,7 +601,7 @@
 ruleDelYear = Rule
   { name = "del <year>"
   , pattern =
-    [ regex "del( a(\x00f1|n)o)?"
+    [ regex "del( a(ñ|n)o)?"
     , Predicate $ isIntegerBetween 1000 2100
     ]
   , prod = \tokens -> case tokens of
@@ -630,15 +611,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "marzo|mar\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleDdmm :: Rule
 ruleDdmm = Rule
   { name = "dd[/-]mm"
@@ -666,15 +638,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "abril|abr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleMidnight :: Rule
 ruleMidnight = Rule
   { name = "midnight"
@@ -688,20 +651,11 @@
 ruleAnoNuevo = Rule
   { name = "ano nuevo"
   , pattern =
-    [ regex "a(n|\x00f1)o nuevo"
+    [ regex "a(n|ñ)o nuevo"
     ]
   , prod = \_ -> tt $ monthDay 1 1
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "viernes|vie|vie\\."
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDdddMonthinterval :: Rule
 ruleDdddMonthinterval = Rule
   { name = "dd-dd <month>(interval)"
@@ -740,15 +694,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "febrero|feb\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleNamedmonthnameddayPast :: Rule
 ruleNamedmonthnameddayPast = Rule
   { name = "<named-month|named-day> past"
@@ -829,7 +774,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
-    , regex "(pr(\x00f3|o)xim(o|a)s?|que vienen?|siguientes?)"
+    , regex "(pr(ó|o)xim(o|a)s?|que vienen?|siguientes?)"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -882,7 +827,7 @@
   { name = "<dim time> de la manana"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(a|en|de) la ma(\x00f1|n)ana"
+    , regex "(a|en|de) la ma(ñ|n)ana"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> do
@@ -926,15 +871,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "junio|jun\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleDentroDeDuration :: Rule
 ruleDentroDeDuration = Rule
   { name = "dentro de <duration>"
@@ -949,25 +885,13 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "agosto|ago\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleWeekend :: Rule
 ruleWeekend = Rule
   { name = "week-end"
   , pattern =
     [ regex "week[ -]?end|fin de semana"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleOrdinalQuarterYear :: Rule
@@ -1055,7 +979,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "ma(\x00f1|n)ana"
+    [ regex "ma(ñ|n)ana"
     ]
   , prod = \_ ->
       let from = hour False 4
@@ -1096,7 +1020,7 @@
   , pattern =
     [ regex "(el|los|la|las) ?"
     , dimension TimeGrain
-    , regex "pasad(a|o)s?|(u|\x00fa)ltim[ao]s?"
+    , regex "pasad(a|o)s?|(u|ú)ltim[ao]s?"
     ]
   , prod = \tokens -> case tokens of
       (_:Token TimeGrain grain:_) ->
@@ -1130,7 +1054,7 @@
 ruleSeason2 = Rule
   { name = "season"
   , pattern =
-    [ regex "oto(\x00f1|n)o"
+    [ regex "oto(ñ|n)o"
     ]
   , prod = \_ ->
       let from = monthDay 9 23
@@ -1215,24 +1139,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mayo?\\.?"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "domingo|dom\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleElTime :: Rule
 ruleElTime = Rule
   { name = "el <time>"
@@ -1258,15 +1164,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "octubre|oct\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleEsteenUnCycle :: Rule
 ruleEsteenUnCycle = Rule
   { name = "este|en un <cycle>"
@@ -1285,7 +1182,7 @@
   { name = "n proximas <cycle>"
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
-    , regex "pr(\x00f3|o)xim(o|a)s?"
+    , regex "pr(ó|o)xim(o|a)s?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -1300,7 +1197,7 @@
   { name = "la pasado <cycle>"
   , pattern =
     [ regex "(el|los|la|las) ?"
-    , regex "pasad(a|o)s?|(u|\x00fa)ltim[ao]s?"
+    , regex "pasad(a|o)s?|(u|ú)ltim[ao]s?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -1337,15 +1234,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "noviembre|nov\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleOrdinalQuarter :: Rule
 ruleOrdinalQuarter = Rule
   { name = "<ordinal> quarter"
@@ -1366,7 +1254,7 @@
   , pattern =
     [ regex "(el|los|la|las) ?"
     , dimension TimeGrain
-    , regex "(pr(\x00f3|o)xim(o|a)s?|que vienen?|siguientes?)"
+    , regex "(pr(ó|o)xim(o|a)s?|que vienen?|siguientes?)"
     ]
   , prod = \tokens -> case tokens of
       (_:Token TimeGrain grain:_) ->
@@ -1380,7 +1268,7 @@
   , pattern =
     [ regex "(el|los|la|las)"
     , dimension TimeGrain
-    , regex "(pr(\x00f3|o)xim(o|a)s?|que vienen?|siguientes?)"
+    , regex "(pr(ó|o)xim(o|a)s?|que vienen?|siguientes?)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1393,7 +1281,7 @@
 ruleDelMedioda = Rule
   { name = "del mediodía"
   , pattern =
-    [ regex "del mediod(i|\x00ed)a"
+    [ regex "del mediod(i|í)a"
     ]
   , prod = \_ ->
       let from = hour False 12
@@ -1402,15 +1290,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mi(e|\x00e9)\\.?(rcoles)?|mx|mier?\\."
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleIntersectByDe :: Rule
 ruleIntersectByDe = Rule
   { name = "intersect by `de`"
@@ -1429,7 +1308,7 @@
 ruleTomorrow = Rule
   { name = "tomorrow"
   , pattern =
-    [ regex "ma(n|\x00f1)ana"
+    [ regex "ma(n|ñ)ana"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -1452,20 +1331,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "septiembre|sept?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleTimezone :: Rule
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isATimeOfDay, isNotLatent]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1523,25 +1393,6 @@
   , ruleNCycleProximoqueViene
   , ruleNPasadosCycle
   , ruleNProximasCycle
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonth
   , ruleNamedmonthnameddayNext
   , ruleNamedmonthnameddayPast
@@ -1591,3 +1442,5 @@
   , ruleHourofdayMinusIntegerAsRelativeMinutes2
   , ruleTimezone
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -10,20 +10,30 @@
 
 module Duckling.Time.FR.Corpus
   ( corpus
+  , negativeCorpus
   ) where
 
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 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)
-import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (testContext {locale = makeLocale FR Nothing}, examples)
+  where
+    examples =
+      [ "Ana a un court de tennis"
+      , "deux trois"
+      , "deux trois minutes"
+      ]
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/FR/Rules.hs b/Duckling/Time/FR/Rules.hs
--- a/Duckling/Time/FR/Rules.hs
+++ b/Duckling/Time/FR/Rules.hs
@@ -13,8 +13,9 @@
 module Duckling.Time.FR.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
+import Data.Text (Text)
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
@@ -29,20 +30,11 @@
 ruleAujourdhui = Rule
   { name = "aujourd'hui"
   , pattern =
-    [ regex "(aujourd'? ?hui)|(ce jour)|(dans la journ(\x00e9|e)e?)|(en ce moment)"
+    [ regex "(aujourd'? ?hui)|(ce jour)|(dans la journ(é|e)e?)|(en ce moment)"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 0
   }
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "lun\\.?(di)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
-
 ruleDayofmonthNamedmonth :: Rule
 ruleDayofmonthNamedmonth = Rule
   { name = "<day-of-month> <named-month>"
@@ -68,7 +60,7 @@
 ruleDbutDeSoire = Rule
   { name = "début de soirée"
   , pattern =
-    [ regex "(en |au )?d(\x00e9|e)but de (la )?soir(\x00e9|e)e"
+    [ regex "(en |au )?d(é|e)but de (la )?soir(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 18) (hour False 21)
@@ -78,7 +70,7 @@
 ruleFinDeSoire = Rule
   { name = "fin de soirée"
   , pattern =
-    [ regex "(en |(\x00e0|a) la )?fin de (la )?soir(\x00e9|e)e"
+    [ regex "(en |(à|a) la )?fin de (la )?soir(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 21) (hour False 0)
@@ -88,7 +80,7 @@
 ruleDbutDeMatine = Rule
   { name = "début de matinée"
   , pattern =
-    [ regex "le matin (tr(e|\x00e8)s )?t(\x00f4|o)t|(tr(e|\x00e8)s )?t(\x00f4|o)t le matin|(en |au )?d(\x00e9|e)but de (la )?matin(\x00e9|e)e"
+    [ regex "le matin (tr(e|è)s )?t(ô|o)t|(tr(e|è)s )?t(ô|o)t le matin|(en |au )?d(é|e)but de (la )?matin(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 7) (hour False 9)
@@ -98,7 +90,7 @@
 ruleMilieuDeMatine = Rule
   { name = "milieu de matinée"
   , pattern =
-    [ regex "(en |au )?milieu de (la )?matin(\x00e9|e)e"
+    [ regex "(en |au )?milieu de (la )?matin(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 9) (hour False 11)
@@ -108,7 +100,7 @@
 ruleFinDeMatine = Rule
   { name = "fin de matinée"
   , pattern =
-    [ regex "(en |(\x00e0|a) la )?fin de (la )?matin(\x00e9|e)e"
+    [ regex "(en |(à|a) la )?fin de (la )?matin(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 10) (hour False 12)
@@ -118,7 +110,7 @@
 ruleDbutDaprsmidi = Rule
   { name = "début d'après-midi"
   , pattern =
-    [ regex "(au |en )?d(\x00e9|e)but (d'|de l')apr(e|\x00e9|\x00e8)s( |\\-)midi"
+    [ regex "(au |en )?d(é|e)but (d'|de l')apr(e|é|è)s( |\\-)midi"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 12) (hour False 14)
@@ -128,7 +120,7 @@
 ruleMilieuDaprsmidi = Rule
   { name = "milieu d'après-midi"
   , pattern =
-    [ regex "(au |en )?milieu (d'|de l')apr(e|\x00e9|\x00e8)s( |\\-)midi"
+    [ regex "(au |en )?milieu (d'|de l')apr(e|é|è)s( |\\-)midi"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 14) (hour False 17)
@@ -138,7 +130,7 @@
 ruleFinDaprsmidi = Rule
   { name = "fin d'après-midi"
   , pattern =
-    [ regex "((\x00e0|a) la |en )?fin (d'|de l')apr(e|\x00e9|\x00e8)s( |\\-)midi"
+    [ regex "((à|a) la |en )?fin (d'|de l')apr(e|é|è)s( |\\-)midi"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 17) (hour False 19)
@@ -148,7 +140,7 @@
 ruleDbutDeJourne = Rule
   { name = "début de journée"
   , pattern =
-    [ regex "(en |au )?d(\x00e9|e)but de (la )?journ(\x00e9|e)e"
+    [ regex "(en |au )?d(é|e)but de (la )?journ(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
         interval TTime.Open (hour False 6) (hour False 10)
@@ -158,7 +150,7 @@
 ruleMilieuDeJourne = Rule
   { name = "milieu de journée"
   , pattern =
-    [ regex "(en |au )?milieu de (la )?journ(\x00e9|e)e"
+    [ regex "(en |au )?milieu de (la )?journ(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 11) (hour False 16)
@@ -168,7 +160,7 @@
 ruleFinDeJourne = Rule
   { name = "fin de journée"
   , pattern =
-    [ regex "(en |(\x00e0|a) la )?fin de (la )?journ(\x00e9|e)e"
+    [ regex "(en |(à|a) la )?fin de (la )?journ(é|e)e"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 17) (hour False 21)
@@ -178,7 +170,7 @@
 ruleDbutDeSemaine = Rule
   { name = "début de semaine"
   , pattern =
-    [ regex "(en |au )?d(\x00e9|e)but de (cette |la )?semaine"
+    [ regex "(en |au )?d(é|e)but de (cette |la )?semaine"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (dayOfWeek 1) (dayOfWeek 2)
@@ -198,7 +190,7 @@
 ruleFinDeSemaine = Rule
   { name = "fin de semaine"
   , pattern =
-    [ regex "(en |(\x00e0|a) la )?fin de (cette |la )?semaine"
+    [ regex "(en |(à|a) la )?fin de (cette |la )?semaine"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (dayOfWeek 4) (dayOfWeek 7)
@@ -217,15 +209,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "d(\x00e9|e)cembre|d(\x00e9|e)c\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleCePartofday :: Rule
 ruleCePartofday = Rule
   { name = "ce <part-of-day>"
@@ -252,15 +235,6 @@
       _ -> Nothing
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mar\\.?(di)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleDurationAvantTime :: Rule
 ruleDurationAvantTime = Rule
   { name = "<duration> avant <time>"
@@ -284,21 +258,12 @@
   , prod = \_ -> tt $ hour False 12
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "sam\\.?(edi)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
   , pattern =
     [ Predicate isNotLatent
-    , regex "\\-|au|jusqu'(au?|\x00e0)"
+    , regex "\\-|au|jusqu'(au?|à)"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -307,15 +272,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juillet|juil?\\."
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleDatetimeddMonthinterval :: Rule
 ruleDatetimeddMonthinterval = Rule
   { name = "<datetime>-dd <month>(interval)"
@@ -340,7 +296,7 @@
   , pattern =
     [ regex "(midi )?de"
     , Predicate isATimeOfDay
-    , regex "\\-|(jusqu')?(\x00e0|au?)"
+    , regex "\\-|(jusqu')?(à|au?)"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -354,7 +310,7 @@
   { name = "n prochains <cycle>"
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
-    , regex "prochaine?s?|suivante?s?|apr(e|\x00e8|\x00e9)s"
+    , regex "prochaine?s?|suivante?s?|apr(e|è|é)s"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -369,7 +325,7 @@
   { name = "n derniers <cycle>"
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
-    , regex "derni(e|\x00e8|\x00e9)re?s?"
+    , regex "derni(e|è|é)re?s?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -383,7 +339,7 @@
 ruleAvantTimeofday = Rule
   { name = "avant <time-of-day>"
   , pattern =
-    [ regex "(n[ ']importe quand )?(avant|jusqu'(a|\x00e0))"
+    [ regex "(n[ ']importe quand )?(avant|jusqu'(a|à))"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -469,15 +425,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "jeu\\.?(di)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleNamedmonthProchain :: Rule
 ruleNamedmonthProchain = Rule
   { name = "<named-month> prochain"
@@ -509,7 +456,7 @@
 ruleToussaint = Rule
   { name = "toussaint"
   , pattern =
-    [ regex "((la |la journ(\x00e9|e)e de la |jour de la )?toussaint|jour des morts)"
+    [ regex "((la |la journ(é|e)e de la |jour de la )?toussaint|jour des morts)"
     ]
   , prod = \_ -> tt $ monthDay 11 1
   }
@@ -518,7 +465,7 @@
 ruleDernierCycleDeTimeLatent = Rule
   { name = "dernier <cycle> de <time> (latent)"
   , pattern =
-    [ regex "derni(e|\x00e9|\x00e8)re?"
+    [ regex "derni(e|é|è)re?"
     , dimension TimeGrain
     , regex "d['e]"
     , dimension Time
@@ -534,7 +481,7 @@
   { name = "<duration> apres <time>"
   , pattern =
     [ dimension Duration
-    , regex "apr(e|\x00e8)s"
+    , regex "apr(e|è)s"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -549,7 +496,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
-    , regex "(d')? ?apr(e|\x00e8|\x00e9)s|qui sui(t|ves?)|plus tard"
+    , regex "(d')? ?apr(e|è|é)s|qui sui(t|ves?)|plus tard"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -587,7 +534,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
-    , regex "(d')? ?avant|plus t(o|\x00f4)t"
+    , regex "(d')? ?avant|plus t(o|ô)t"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -601,7 +548,7 @@
   { name = "<dim time> du matin"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "((du|dans|de) )?((au|le|la) )?mat(in(\x00e9|e)?e?)?"
+    , regex "((du|dans|de) )?((au|le|la) )?mat(in(é|e)?e?)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> do
@@ -622,22 +569,11 @@
   , prod = \tokens -> case tokens of
       (token:_:Token Time td:_) -> do
         n <- getIntValue token
-        from <- intersect (dayOfWeek 5) (hour False 18)
-        to <- intersect (dayOfWeek 1) (hour False 0)
-        td2 <- intersect td =<< interval TTime.Open from to
+        td2 <- intersect td weekend
         tt $ predNth (n - 1) False td2
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "janvier|janv\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleHourofdayEtQuart :: Rule
 ruleHourofdayEtQuart = Rule
   { name = "<hour-of-day> et quart"
@@ -682,7 +618,7 @@
   { name = "<hour-of-day> et|passé de <number>"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "et|(pass(\x00e9|e)e? de)"
+    , regex "et|(pass(é|e)e? de)"
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -700,7 +636,7 @@
   { name = "<hour-of-day> et|passé de <number> minutes"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "et|(pass(\x00e9|e)e? de)"
+    , regex "et|(pass(é|e)e? de)"
     , Predicate $ isIntegerBetween 1 59
     , regex "min\\.?(ute)?s?"
     ]
@@ -718,7 +654,7 @@
 ruleHourofdayInteger = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay, hasNoDirection]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -734,7 +670,7 @@
 ruleHourofdayIntegerMinutes = Rule
   { name = "<hour-of-day> <integer> minutes"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     , regex "min\\.?(ute)?s?"
     ]
@@ -781,7 +717,7 @@
 ruleAprsLeDayofmonth = Rule
   { name = "après le <day-of-month>"
   , pattern =
-    [ regex "(apr(e|\x00e8)s le|(a|\x00e0) partir du)"
+    [ regex "(apr(e|è)s le|(a|à) partir du)"
     , Predicate isDOMInteger
     ]
   , prod = \tokens -> case tokens of
@@ -791,21 +727,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mars|mar\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleCycleDernier :: Rule
 ruleCycleDernier = Rule
   { name = "<cycle> dernier"
   , pattern =
     [ dimension TimeGrain
-    , regex "derni(\x00e8|e)re?|pass(\x00e9|e)e?|pr(e|\x00e9)c(e|\x00e9)dente?|(d')? ?avant"
+    , regex "derni(è|e)re?|pass(é|e)e?|pr(e|é)c(e|é)dente?|(d')? ?avant"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) ->
@@ -859,7 +786,7 @@
   { name = "<named-month|named-day> dernier|passé"
   , pattern =
     [ dimension Time
-    , regex "derni(e|\x00e9|\x00e8)re?|pass(\x00e9|e)e?"
+    , regex "derni(e|é|è)re?|pass(é|e)e?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -867,22 +794,13 @@
       _ -> Nothing
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "avril|avr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleLeCycleDernier :: Rule
 ruleLeCycleDernier = Rule
   { name = "le <cycle> dernier"
   , pattern =
     [ regex "l[ae']? ?"
     , dimension TimeGrain
-    , regex "derni(\x00e8|e)re?|pass(\x00e9|e)e?"
+    , regex "derni(è|e)re?|pass(é|e)e?"
     ]
   , prod = \tokens -> case tokens of
       (_:Token TimeGrain grain:_) ->
@@ -896,7 +814,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
-    , regex "pass(e|\x00e8|\x00e9)(e|\x00e8|\x00e9)?s?|pr(e|\x00e9)c(e|\x00e9)dente?s?|(d')? ?avant|plus t(o|\x00f4)t"
+    , regex "pass(e|è|é)(e|è|é)?s?|pr(e|é)c(e|é)dente?s?|(d')? ?avant|plus t(o|ô)t"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -909,21 +827,12 @@
 ruleSoir = Rule
   { name = "soir"
   , pattern =
-    [ regex "soir(\x00e9|e)?e?"
+    [ regex "soir(é|e)?e?"
     ]
   , prod = \_ -> Token Time . mkLatent . partOfDay <$>
       interval TTime.Open (hour False 18) (hour False 0)
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "ven\\.?(dredi)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDdddMonthinterval :: Rule
 ruleDdddMonthinterval = Rule
   { name = "dd-dd <month>(interval)"
@@ -981,7 +890,7 @@
 ruleDbutNamedmonthinterval = Rule
   { name = "début <named-month>(interval)"
   , pattern =
-    [ regex "d(\x00e9|e)but( du mois d[e'] ?)?"
+    [ regex "d(é|e)but( du mois d[e'] ?)?"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -992,15 +901,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "f(\x00e9|e)vrier|f(\x00e9|e)v\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleLeCycleDeTime :: Rule
 ruleLeCycleDeTime = Rule
   { name = "le <cycle> de <time>"
@@ -1030,7 +930,7 @@
 ruleSeason = Rule
   { name = "season"
   , pattern =
-    [ regex "(cet )?(\x00e9|e)t(\x00e9|e)"
+    [ regex "(cet )?(é|e)t(é|e)"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (monthDay 6 21) (monthDay 9 23)
@@ -1040,7 +940,7 @@
 ruleAprsmidi = Rule
   { name = "après-midi"
   , pattern =
-    [ regex "apr(e|\x00e9|\x00e8)s( |\\-)midi"
+    [ regex "apr(e|é|è)s( |\\-)midi"
     ]
   , prod = \_ -> Token Time . mkLatent . partOfDay <$>
       interval TTime.Open (hour False 12) (hour False 19)
@@ -1050,7 +950,7 @@
 ruleNoel = Rule
   { name = "noel"
   , pattern =
-    [ regex "(jour de )?no(e|\x00eb)l"
+    [ regex "(jour de )?no(e|ë)l"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -1082,7 +982,7 @@
   { name = "<named-month|named-day> suivant|d'après"
   , pattern =
     [ dimension Time
-    , regex "suivante?s?|d'apr(e|\x00e9|\x00e8)s"
+    , regex "suivante?s?|d'apr(e|é|è)s"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -1122,7 +1022,7 @@
   { name = "<dim time> du soir"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "((du|dans|de) )?((au|le|la) )?soir(\x00e9|e)?e?"
+    , regex "((du|dans|de) )?((au|le|la) )?soir(é|e)?e?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> do
@@ -1136,7 +1036,7 @@
 ruleAprsTimeofday = Rule
   { name = "après <time-of-day>"
   , pattern =
-    [ regex "(apr(e|\x00e8)s|(a|\x00e0) partir de|(un peu )?plus tard que)"
+    [ regex "(apr(e|è)s|(a|à) partir de|(un peu )?plus tard que)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1149,7 +1049,7 @@
 ruleAprsLeDjeuner = Rule
   { name = "après le déjeuner"
   , pattern =
-    [ regex "apr(e|\x00e8)s (le )?d(e|\x00e9|\x00e8)jeuner"
+    [ regex "apr(e|è)s (le )?d(e|é|è)jeuner"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day 0
@@ -1174,7 +1074,7 @@
 ruleErMai = Rule
   { name = "1er mai"
   , pattern =
-    [ regex "f(e|\x00ea)te du travail"
+    [ regex "f(e|ê)te du travail"
     ]
   , prod = \_ -> tt $ monthDay 5 1
   }
@@ -1183,7 +1083,7 @@
 rulePremireQuinzaineDeNamedmonthinterval = Rule
   { name = "première quinzaine de <named-month>(interval)"
   , pattern =
-    [ regex "(premi(\x00e8|e)re|1 ?(\x00e8|e)re) (quinzaine|15 ?aine) d[e']"
+    [ regex "(premi(è|e)re|1 ?(è|e)re) (quinzaine|15 ?aine) d[e']"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -1200,7 +1100,7 @@
   , pattern =
     [ regex "de|depuis|du"
     , dimension Time
-    , regex "\\-|au|jusqu'(au?|\x00e0)"
+    , regex "\\-|au|jusqu'(au?|à)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1223,7 +1123,7 @@
   { name = "<cycle> prochain|suivant|d'après"
   , pattern =
     [ dimension TimeGrain
-    , regex "prochaine?|suivante?|qui suit|(d')? ?apr(e|\x00e8|\x00e9)s"
+    , regex "prochaine?|suivante?|qui suit|(d')? ?apr(e|è|é)s"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) ->
@@ -1231,20 +1131,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juin|jun\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleAprsLeTravail :: Rule
 ruleAprsLeTravail = Rule
   { name = "après le travail"
   , pattern =
-    [ regex "apr(e|\x00e8)s (le )?travail"
+    [ regex "apr(e|è)s (le )?travail"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day 0
@@ -1252,22 +1143,13 @@
       Token Time . partOfDay <$> intersect td1 td2
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "ao(\x00fb|u)t|aou\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleLeDayofmonthDatetime :: Rule
 ruleLeDayofmonthDatetime = Rule
   { name = "le <day-of-month> à <datetime>"
   , pattern =
     [ regex "le"
     , Predicate isDOMInteger
-    , regex "(a|\x00e0)"
+    , regex "(a|à)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1283,10 +1165,7 @@
   , pattern =
     [ regex "week(\\s|-)?end"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleCedansLeCycle :: Rule
@@ -1335,7 +1214,7 @@
 ruleAvantLeDjeuner = Rule
   { name = "avant le déjeuner"
   , pattern =
-    [ regex "avant (le )?d(e|\x00e9|\x00e8)jeuner"
+    [ regex "avant (le )?d(e|é|è)jeuner"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day 0
@@ -1352,10 +1231,7 @@
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> do
-        from <- intersect (dayOfWeek 5) (hour False 18)
-        to <- intersect (dayOfWeek 1) (hour False 0)
-        td2 <- interval TTime.Open from to
-        tt $ predLastOf td2 td
+        tt $ predLastOf weekend td
       _ -> Nothing
   }
 
@@ -1365,7 +1241,7 @@
   , pattern =
     [ regex "l[ae']? ?|une? ?"
     , dimension TimeGrain
-    , regex "prochaine?|suivante?|qui suit|(d'? ?)?apr(e|\x00e8|\x00e9)s"
+    , regex "prochaine?|suivante?|qui suit|(d'? ?)?apr(e|è|é)s"
     ]
   , prod = \tokens -> case tokens of
       (_:Token TimeGrain grain:_) ->
@@ -1431,7 +1307,7 @@
 ruleDeuximeQuinzaineDeNamedmonthinterval = Rule
   { name = "deuxième quinzaine de <named-month>(interval)"
   , pattern =
-    [ regex "(deuxi(\x00e8|e)me|2 ?(\x00e8|e)me) (quinzaine|15 ?aine) d[e']"
+    [ regex "(deuxi(è|e)me|2 ?(è|e)me) (quinzaine|15 ?aine) d[e']"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -1488,7 +1364,7 @@
 ruleDernierDayofweekDeTimeLatent = Rule
   { name = "dernier <day-of-week> de <time> (latent)"
   , pattern =
-    [ regex "derni(e|\x00e9|\x00e8)re?"
+    [ regex "derni(e|é|è)re?"
     , Predicate isADayOfWeek
     , regex "d['e]"
     , dimension Time
@@ -1553,7 +1429,7 @@
 ruleMatin = Rule
   { name = "matin"
   , pattern =
-    [ regex "mat(in(\x00e9|e)?e?)?"
+    [ regex "mat(in(é|e)?e?)?"
     ]
   , prod = \_ -> Token Time . mkLatent . partOfDay <$>
       interval TTime.Open (hour False 4) (hour False 12)
@@ -1586,12 +1462,11 @@
 ruleVersTimeofday = Rule
   { name = "à|vers <time-of-day>"
   , pattern =
-    [ regex "(vers|autour de|(a|\x00e0) environ|aux alentours de|(a|\x00e0))"
-    , Predicate isATimeOfDay
+    [ regex "(vers|autour de|(a|à) environ|aux alentours de|(a|à))"
+    , Predicate $ and . sequence [isATimeOfDay, isNotLatent]
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        tt $ notLatent td
+      (_:x:_) -> Just x
       _ -> Nothing
   }
 
@@ -1654,7 +1529,7 @@
   { name = "intersect by 'mais/par exemple/plutôt'"
   , pattern =
     [ Predicate isNotLatent
-    , regex "mais|par exemple|plut(\x00f4|o)t"
+    , regex "mais|par exemple|plut(ô|o)t"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -1667,9 +1542,9 @@
 ruleLeCycleAprssuivantTime = Rule
   { name = "le <cycle> après|suivant <time>"
   , pattern =
-    [ regex "l[ea']? ?"
+    [ regex "l[ea']?"
     , dimension TimeGrain
-    , regex "suivante?|apr(e|\x00e8|\x00e9)s"
+    , regex "suivante?|apr(e|è|é)s"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1689,7 +1564,12 @@
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
-      (_:Token RegexMatch (GroupMatch (m1:_)):_:Token RegexMatch (GroupMatch (m2:_)):Token Time td:_) -> do
+      (_:
+       Token RegexMatch (GroupMatch (m1:_)):
+       _:
+       Token RegexMatch (GroupMatch (m2:_)):
+       Token Time td:
+       _) -> do
         n1 <- parseInt m1
         n2 <- parseInt m2
         from <- intersect (dayOfMonth n1) td
@@ -1702,29 +1582,11 @@
 ruleAprsdemain = Rule
   { name = "après-demain"
   , pattern =
-    [ regex "apr(e|\x00e8)s[- ]?demain"
+    [ regex "apr(e|è)s[- ]?demain"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mai"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "dim\\.?(anche)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleIlYADuration :: Rule
 ruleIlYADuration = Rule
   { name = "il y a <duration>"
@@ -1742,7 +1604,7 @@
 ruleDudansLePartofday = Rule
   { name = "du|dans le <part-of-day>"
   , pattern =
-    [ regex "du|dans l[ae']? ?|au|en|l[ae' ]|d(\x00e8|e)s l?[ae']? ?"
+    [ regex "du|dans l[ae']? ?|au|en|l[ae' ]|d(è|e)s l?[ae']?"
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1755,7 +1617,7 @@
 ruleAuDjeuner = Rule
   { name = "au déjeuner"
   , pattern =
-    [ regex "((\x00e0|a) l'heure du|au moment de|pendant( le)?|au)? d(e|\x00e9|\x00e8)jeuner"
+    [ regex "((à|a) l'heure du|au moment de|pendant( le)?|au)? d(e|é|è)jeuner"
     ]
   , prod = \_ -> Token Time . partOfDay <$>
       interval TTime.Open (hour False 12) (hour False 14)
@@ -1774,20 +1636,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "octobre|oct\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleMaintenant :: Rule
 ruleMaintenant = Rule
   { name = "maintenant"
   , pattern =
-    [ regex "maintenant|(tout de suite)"
+    [ regex "maintenant|tout de suite"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -1811,9 +1664,9 @@
 ruleLeCycleAvantprcdentTime = Rule
   { name = "le <cycle> avant|précédent <time>"
   , pattern =
-    [ regex "l[ea']? ?"
+    [ regex "l[ea']?"
     , dimension TimeGrain
-    , regex "avant|pr(\x00e9|e)c(\x00e9|e)dent"
+    , regex "avant|pr(é|e)c(é|e)dent"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1826,7 +1679,7 @@
 ruleDayOfMonthPremier = Rule
   { name = "day of month (premier)"
   , pattern =
-    [ regex "premier|prem\\.?|1er|1 er"
+    [ regex "premier|prem\\.?|1 ?er"
     ]
   , prod = \_ -> tt $ dayOfMonth 1
   }
@@ -1836,7 +1689,7 @@
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "\\-|(jusqu')?(au?|\x00e0)"
+    , regex "\\-|(jusqu')?(au?|à)"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1858,15 +1711,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "novembre|nov\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleLeTime :: Rule
 ruleLeTime = Rule
   { name = "le <time>"
@@ -1883,7 +1727,7 @@
 ruleSoirDeNol = Rule
   { name = "soir de noël"
   , pattern =
-    [ regex "soir(\x00e9e)? de no(e|\x00eb)l"
+    [ regex "soir(ée)? de no(e|ë)l"
     ]
   , prod = \_ -> do
       from <- intersect (monthDay 12 24) (hour False 18)
@@ -1915,15 +1759,6 @@
   , prod = \_ -> tt $ monthDay 1 1
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mer\\.?(credi)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleMinuit :: Rule
 ruleMinuit = Rule
   { name = "minuit"
@@ -1939,7 +1774,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
-    , regex "prochaine?s?|suivante?s?|apr(e|\x00e8|\x00e9)s|qui sui(t|ves?)|plus tard"
+    , regex "prochaine?s?|suivante?s?|apr(e|è|é)s|qui sui(t|ves?)|plus tard"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -1948,8 +1783,8 @@
       _ -> Nothing
   }
 
-ruleNamedmonth13 :: Rule
-ruleNamedmonth13 = Rule
+ruleMidMonth :: Rule
+ruleMidMonth = Rule
   { name = "<named-month>"
   , pattern =
     [ regex "mi[- ]"
@@ -1983,20 +1818,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "septembre|sept?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleFinDuMois :: Rule
 ruleFinDuMois = Rule
   { name = "fin du mois"
   , pattern =
-    [ regex "(en |((\x00e0|a) la ))?fin (du|de) (ce )?mois"
+    [ regex "(en |((à|a) la ))?fin (du|de) (ce )?mois"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (dayOfMonth 21) (dayOfMonth 0)
@@ -2006,7 +1832,7 @@
 ruleDbutDuMois = Rule
   { name = "début du mois"
   , pattern =
-    [ regex "(en |au )?d(\x00e9|e)but (du|de) (ce )?mois"
+    [ regex "(en |au )?d(é|e)but (du|de) (ce )?mois"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (dayOfMonth 1) (dayOfMonth 10)
@@ -2016,7 +1842,7 @@
 ruleFinDAnnee = Rule
   { name = "fin d'année"
   , pattern =
-    [ regex "(en |(\x00e0|a) la )?fin (d'|de l'|de cette )ann(\x00e9|e)e"
+    [ regex "(en |(à|a) la )?fin (d'|de l'|de cette )ann(é|e)e"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (month 11) (month 1)
@@ -2026,7 +1852,7 @@
 ruleDbutDAnnee = Rule
   { name = "début d'année"
   , pattern =
-    [ regex "(en |au )?d(\x00e9|e)but (d'|de l'|de cette )ann(\x00e9|e)e"
+    [ regex "(en |au )?d(é|e)but (d'|de l'|de cette )ann(é|e)e"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (month 1) (month 3)
@@ -2058,7 +1884,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -2068,6 +1894,51 @@
       _ -> Nothing
   }
 
+months :: [(Text, String)]
+months =
+  [ ( "Janvier"   , "janvier|janv\\.?"                    )
+  , ( "Fevrier"   , "f(é|e)vrier|f(é|e)v\\.?"   )
+  , ( "Mars"      , "mars|mar\\.?"                        )
+  , ( "Avril"     , "avril|avr\\.?"                       )
+  , ( "Mai"       , "mai"                                 )
+  , ( "Juin"      , "juin|jun\\.?"                        )
+  , ( "Juillet"   , "juillet|juil?\\."                    )
+  , ( "Aout"      , "ao(û|u)t|aou\\.?"               )
+  , ( "Septembre" , "septembre|sept?\\.?"                 )
+  , ( "Octobre"   , "octobre|oct\\.?"                     )
+  , ( "Novembre"  , "novembre|nov\\.?"                    )
+  , ( "Decembre"  ,  "d(é|e)cembre|d(é|e)c\\.?" )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Lundi"    , "lun\\.?(di)?"    )
+  , ( "Mardi"    , "mar\\.?(di)?"    )
+  , ( "Mercredi" , "mer\\.?(credi)?" )
+  , ( "Jeudi"    , "jeu\\.?(di)?"    )
+  , ( "Vendredi" , "ven\\.?(dredi)?" )
+  , ( "Samedi"   , "sam\\.?(edi)?"   )
+  , ( "Dimanche" , "dim\\.?(anche)?" )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
 rules :: [Rule]
 rules =
   [ ruleAprsLeDayofmonth
@@ -2095,6 +1966,7 @@
   , ruleDayofmonthNamedmonth
   , ruleDayofweekDayofmonth
   , ruleDayofweekDayofmonthTimeofday
+  , ruleMidMonth
   , ruleDayofweekErdayofweekDdMonthinterval
   , ruleDayofweekProchain
   , ruleDbutDaprsmidi
@@ -2168,28 +2040,8 @@
   , ruleNCycleSuivants
   , ruleNDerniersCycle
   , ruleNProchainsCycle
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
   , ruleNameddayEnHuit
   , ruleNameddayEnQuinze
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth13
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthProchain
   , ruleNamedmonthnameddayDernierpass
   , ruleNamedmonthnameddaySuivantdaprs
@@ -2233,3 +2085,5 @@
   , rulePlusTard
   , rulePlusTardPartofday
   ]
+  ++ ruleMonths
+  ++ ruleDaysOfWeek
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
@@ -9,19 +9,20 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.GA.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.TimeGrain.Types hiding (add)
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/GA/Rules.hs b/Duckling/Time/GA/Rules.hs
--- a/Duckling/Time/GA/Rules.hs
+++ b/Duckling/Time/GA/Rules.hs
@@ -13,6 +13,7 @@
 module Duckling.Time.GA.Rules
   ( rules ) where
 
+import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
@@ -27,65 +28,20 @@
 ruleArInn = Rule
   { name = "arú inné"
   , pattern =
-    [ regex "ar(\x00fa|u) inn(\x00e9|e)"
+    [ regex "ar(ú|u) inn(é|e)"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "luai?n|lu\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
-
 ruleNollaigNaMban :: Rule
 ruleNollaigNaMban = Rule
   { name = "Nollaig na mBan"
   , pattern =
-    [ regex "(l(\x00e1|a) |an )?nollaig (bheag|na mban)"
+    [ regex "(l(á|a) |an )?nollaig (bheag|na mban)"
     ]
   , prod = \_ -> tt $ monthDay 1 6
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(na )?nollai?g|nol\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mh?(\x00e1|a)irt|m(\x00e1|a)?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "sathai?rn|sa\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?i(\x00fa|u)il|i(\x00fa|u)i\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleInniu :: Rule
 ruleInniu = Rule
   { name = "inniu"
@@ -102,7 +58,7 @@
     [ regex "an"
     , dimension Ordinal
     , dimension TimeGrain
-    , regex "(i ndiaidh|tar (\x00e9|e)is)"
+    , regex "(i ndiaidh|tar (é|e)is)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -115,7 +71,7 @@
 ruleInn = Rule
   { name = "inné"
   , pattern =
-    [ regex "inn(\x00e9|e)"
+    [ regex "inn(é|e)"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -124,7 +80,7 @@
 ruleLFhileBrde = Rule
   { name = "Lá Fhéile Bríde"
   , pattern =
-    [ regex "(l(\x00e1|a) )?(fh(e|\x00e9)ile|'?le) bh?r(\x00ed|i)de"
+    [ regex "(l(á|a) )?(fh(e|é)ile|'?le) bh?r(í|i)de"
     ]
   , prod = \_ -> tt $ monthDay 2 1
   }
@@ -133,7 +89,7 @@
 ruleLFhileVailintn = Rule
   { name = "Lá Fhéile Vailintín"
   , pattern =
-    [ regex "(l(\x00e1|a) )?(fh(e|\x00e9)ile|'?le) vailint(\x00ed|i)n"
+    [ regex "(l(á|a) )?(fh(e|é)ile|'?le) vailint(í|i)n"
     ]
   , prod = \_ -> tt $ monthDay 2 14
   }
@@ -169,7 +125,7 @@
   { name = "<time> seo chugainn"
   , pattern =
     [ Predicate isNotLatent
-    , regex "seo (chugainn|at(a|\x00e1) ag teacht)"
+    , regex "seo (chugainn|at(a|á) ag teacht)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -177,20 +133,11 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "d(\x00e9|e)ardaoin|d(\x00e9|e)?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleAmrach :: Rule
 ruleAmrach = Rule
   { name = "amárach"
   , pattern =
-    [ regex "am(\x00e1|a)rach"
+    [ regex "am(á|a)rach"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -208,24 +155,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(an )?t?ean(\x00e1|a)ir|ean\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(an )?mh?(\x00e1|a)rta|m(\x00e1|a)r\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleOrdinalRithe :: Rule
 ruleOrdinalRithe = Rule
   { name = "<ordinal> ráithe"
@@ -261,7 +190,7 @@
   { name = "<cycle> ó shin"
   , pattern =
     [ dimension TimeGrain
-    , regex "(\x00f3|o) shin"
+    , regex "(ó|o) shin"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) ->
@@ -283,15 +212,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(an )?t?aibre(\x00e1|a)i?n|abr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleIGceannCycle :: Rule
 ruleIGceannCycle = Rule
   { name = "i gceann <cycle>"
@@ -321,15 +241,6 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "h?aoine|ao\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -376,7 +287,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
-    , regex "(\x00f3|o)(n l(\x00e1|a) (at(\x00e1|a) )?)?inniu"
+    , regex "(ó|o)(n l(á|a) (at(á|a) )?)?inniu"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -385,22 +296,13 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(na )?feabhra|fea\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleOrdinalCycleINdiaidhTime :: Rule
 ruleOrdinalCycleINdiaidhTime = Rule
   { name = "<ordinal> <cycle> i ndiaidh <time>"
   , pattern =
     [ dimension Ordinal
     , dimension TimeGrain
-    , regex "(i ndiaidh|tar (\x00e9|e)is)"
+    , regex "(i ndiaidh|tar (é|e)is)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -436,24 +338,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(an )?mh?eith(ea|i)mh|mei\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(na )?l(\x00fa|u)nasa|l(\x00fa|u)n\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleAnOrdinalCycleDeTime :: Rule
 ruleAnOrdinalCycleDeTime = Rule
   { name = "an <ordinal> <cycle> de <time>"
@@ -474,7 +358,7 @@
 ruleLNaNaithreacha = Rule
   { name = "Lá na nAithreacha"
   , pattern =
-    [ regex "l(\x00e1|a) na naithreacha"
+    [ regex "l(á|a) na naithreacha"
     ]
   , prod = \_ -> tt $ nthDOWOfMonth 2 7 6
   }
@@ -483,7 +367,7 @@
 ruleArAmrach = Rule
   { name = "arú amárach"
   , pattern =
-    [ regex "ar(\x00fa|u) am(\x00e1|a)rach"
+    [ regex "ar(ú|u) am(á|a)rach"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
@@ -534,7 +418,7 @@
 ruleAnNollaig = Rule
   { name = "An Nollaig"
   , pattern =
-    [ regex "(l(\x00e1|a) |an )?(nollai?g)"
+    [ regex "(l(á|a) |an )?(nollai?g)"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -577,7 +461,7 @@
 ruleLFhilePdraig = Rule
   { name = "Lá Fhéile Pádraig"
   , pattern =
-    [ regex "(l(\x00e1|a) )?(fh(e|\x00e9)ile|'?le) ph?(\x00e1|a)draig"
+    [ regex "(l(á|a) )?(fh(e|é)ile|'?le) ph?(á|a)draig"
     ]
   , prod = \_ -> tt $ monthDay 3 17
   }
@@ -588,7 +472,7 @@
   , pattern =
     [ regex "the"
     , dimension TimeGrain
-    , regex "(i ndiaidh|tar (\x00e9|e)is)"
+    , regex "(i ndiaidh|tar (é|e)is)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -624,24 +508,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(na )?bh?ealtaine|bea\\.?"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "domhnai?[cg]h|do\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleAnDayofmonthNonOrdinal :: Rule
 ruleAnDayofmonthNonOrdinal = Rule
   { name = "an <day-of-month> (non ordinal)"
@@ -660,7 +526,7 @@
 ruleDNamedday = Rule
   { name = "dé named-day"
   , pattern =
-    [ regex "d(\x00e9|e)"
+    [ regex "d(é|e)"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -681,15 +547,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?dh?eireadh f(\x00f3|o)mhair|def?\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleCycleRoimhTime :: Rule
 ruleCycleRoimhTime = Rule
   { name = "<cycle> roimh <time>"
@@ -731,15 +588,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?(na )?samh(ain|na)|sam\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleAnNamedday :: Rule
 ruleAnNamedday = Rule
   { name = "an named-day"
@@ -752,21 +600,57 @@
       _ -> Nothing
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "ch?(\x00e9|e)adaoin|c(\x00e9|e)\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Monday"   , "luai?n|lu\\.?"                       )
+  , ( "Tuesday"  , "mh?(á|a)irt|m(á|a)?\\.?"   )
+  , ( "Wednesday", "ch?(é|e)adaoin|c(é|e)\\.?" )
+  , ( "Thursday" , "d(é|e)ardaoin|d(é|e)?\\.?" )
+  , ( "Friday"   , "h?aoine|ao\\.?"                      )
+  , ( "Saturday" , "sathai?rn|sa\\.?"                    )
+  , ( "Sunday"   , "domhnai?[cg]h|do\\.?"                )
+  ]
 
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "January"  , "(mh?(í|i) )?(an )?t?ean(á|a)ir|ean\\.?"          )
+  , ( "February" , "(mh?(í|i) )?(na )?feabhra|fea\\.?"                    )
+  , ( "March"    , "(mh?(í|i) )?(an )?mh?(á|a)rta|m(á|a)r\\.?"  )
+  , ( "April"    , "(mh?(í|i) )?(an )?t?aibre(á|a)i?n|abr\\.?"       )
+  , ( "May"      , "(mh?(í|i) )?(na )?bh?ealtaine|bea\\.?"                )
+  , ( "June"     , "(mh?(í|i) )?(an )?mh?eith(ea|i)mh|mei\\.?"            )
+  , ( "July"     , "(mh?(í|i) )?i(ú|u)il|i(ú|u)i\\.?"           )
+  , ( "August"   , "(mh?(í|i) )?(na )?l(ú|u)nasa|l(ú|u)n\\.?"   )
+  , ( "September", "(mh?(í|i) )?mh?e(á|a)n f(ó|o)mhair|mef?\\.?")
+  , ( "October"  , "(mh?(í|i) )?(na )?nollai?g|nol\\.?"                   )
+  , ( "November" , "(mh?(í|i) )?(na )?samh(ain|na)|sam\\.?"               )
+  , ( "December" , "(mh?(í|i) )?(na )?nollai?g|nol\\.?"                   )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleCycleINdiaidhTime :: Rule
 ruleCycleINdiaidhTime = Rule
   { name = "<cycle> i ndiaidh <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "(i ndiaidh|tar (\x00e9|e)is)"
+    , regex "(i ndiaidh|tar (é|e)is)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -775,15 +659,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(mh?(\x00ed|i) )?mh?e(\x00e1|a)n f(\x00f3|o)mhair|mef?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -837,25 +712,6 @@
   , ruleLFhilePdraig
   , ruleLFhileVailintn
   , ruleLNaNaithreacha
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNollaigNaMban
   , ruleOnANamedday
   , ruleOrdinalCycleDeTime
@@ -870,3 +726,5 @@
   , ruleYearLatent2
   , ruleYyyymmdd
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -8,12 +8,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.HE.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month)
@@ -21,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = HE}, allExamples)
+corpus = (testContext {locale = makeLocale HE Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/HE/Rules.hs b/Duckling/Time/HE/Rules.hs
--- a/Duckling/Time/HE/Rules.hs
+++ b/Duckling/Time/HE/Rules.hs
@@ -36,7 +36,7 @@
   { name = "next <day-of-week>"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "(\x05d4\x05d1\x05d0(\x05d4)?)"
+    , regex "(הבא(ה)?)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -48,7 +48,7 @@
 ruleNamedday = Rule
   { name = "ב <named-day>"
   , pattern =
-    [ regex "\x05d1"
+    [ regex "ב"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -60,7 +60,7 @@
 ruleAtHourTimeofday = Rule
   { name = "at hour <time-of-day>"
   , pattern =
-    [ regex "\x05d1\x05e9\x05e2\x05d4"
+    [ regex "בשעה"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -69,21 +69,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05d3\x05e6\x05de\x05d1\x05e8"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleHourofdayAndInteger :: Rule
 ruleHourofdayAndInteger = Rule
   { name = "<hour-of-day> and <integer>"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x05d5"
+    , regex "ו"
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -101,8 +92,8 @@
   { name = "<hour-of-day> and quarter"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x05d5"
-    , regex "\x05e8\x05d1\x05e2(\x05d9)?"
+    , regex "ו"
+    , regex "רבע(י)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
@@ -115,8 +106,8 @@
   { name = "<hour-of-day> and half"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x05d5"
-    , regex "\x05d7\x05e6\x05d9|\x05de\x05d7\x05e6\x05d9\x05ea"
+    , regex "ו"
+    , regex "חצי|מחצית"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
@@ -145,7 +136,7 @@
   { name = "<hour-of-day> quarter"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x05e8\x05d1\x05e2(\x05d9)?"
+    , regex "רבע(י)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
@@ -158,7 +149,7 @@
   { name = "<hour-of-day> half"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x05d7\x05e6\x05d9|\x05de\x05d7\x05e6\x05d9\x05ea"
+    , regex "חצי|מחצית"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
@@ -171,7 +162,7 @@
   { name = "<integer> to|till|before <integer> (hour-of-day)"
   , pattern =
     [ Predicate $ isIntegerBetween 1 59
-    , regex "\x05dc\x05e4\x05e0\x05d9|\x05dc"
+    , regex "לפני|ל"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -186,8 +177,8 @@
 ruleQuarterTotillbeforeIntegerHourofday = Rule
   { name = "quarter to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "\x05e8\x05d1\x05e2(\x05d9)?"
-    , regex "\x05dc\x05e4\x05e0\x05d9|\x05dc"
+    [ regex "רבע(י)?"
+    , regex "לפני|ל"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -199,8 +190,8 @@
 ruleHalfTotillbeforeIntegerHourofday = Rule
   { name = "half to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "\x05d7\x05e6\x05d9|\x05de\x05d7\x05e6\x05d9\x05ea"
-    , regex "\x05dc\x05e4\x05e0\x05d9|\x05dc"
+    [ regex "חצי|מחצית"
+    , regex "לפני|ל"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -213,7 +204,7 @@
   { name = "integer after|past <integer> (hour-of-day)"
   , pattern =
     [ Predicate $ isIntegerBetween 1 59
-    , regex "\x05d0\x05d7\x05e8\x05d9"
+    , regex "אחרי"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -228,8 +219,8 @@
 ruleQuarterAfterpastIntegerHourofday = Rule
   { name = "quarter after|past <integer> (hour-of-day)"
   , pattern =
-    [ regex "\x05e8\x05d1\x05e2(\x05d9)?"
-    , regex "\x05d0\x05d7\x05e8\x05d9"
+    [ regex "רבע(י)?"
+    , regex "אחרי"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -241,8 +232,8 @@
 ruleHalfAfterpastIntegerHourofday = Rule
   { name = "half after|past <integer> (hour-of-day)"
   , pattern =
-    [ regex "\x05d7\x05e6\x05d9|\x05de\x05d7\x05e6\x05d9\x05ea"
-    , regex "\x05d0\x05d7\x05e8\x05d9"
+    [ regex "חצי|מחצית"
+    , regex "אחרי"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -254,7 +245,7 @@
 ruleNamedday2 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "(\x05d9\x05d5\x05dd )?\x05e9\x05e0\x05d9"
+    [ regex "(יום )?שני"
     ]
   , prod = \_ -> tt $ dayOfWeek 1
   }
@@ -263,7 +254,7 @@
 ruleSinceTimeofday = Rule
   { name = "since <time-of-day>"
   , pattern =
-    [ regex "\x05de"
+    [ regex "מ"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -276,7 +267,7 @@
   { name = "last <time>"
   , pattern =
     [ dimension Time
-    , regex "\x05e9\x05e2\x05d1\x05e8|(\x05d4)?\x05e7\x05d5\x05d3\x05dd|(\x05d4)?\x05d0\x05d7\x05e8\x05d5\x05df"
+    , regex "שעבר|(ה)?קודם|(ה)?אחרון"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -288,7 +279,7 @@
 ruleNamedday6 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "(\x05d9\x05d5\x05dd )?\x05e9\x05d9\x05e9\x05d9"
+    [ regex "(יום )?שישי"
     ]
   , prod = \_ -> tt $ dayOfWeek 5
   }
@@ -298,7 +289,7 @@
   { name = "<datetime> - <datetime> (interval)"
   , pattern =
     [ Predicate isNotLatent
-    , regex "\\-|\x05e2(\x05d3)?"
+    , regex "\\-|ע(ד)?"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -307,20 +298,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05d9\x05d5\x05dc\x05d9"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleTheDayofmonthNonOrdinal :: Rule
 ruleTheDayofmonthNonOrdinal = Rule
   { name = "the <day-of-month> (non ordinal)"
   , pattern =
-    [ regex "\x05d4/S"
+    [ regex "ה/S"
     , Predicate isDOMInteger
     ]
   , prod = \tokens -> case tokens of
@@ -335,7 +317,7 @@
   { name = "<cycle> after <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "\x05d0\x05d7\x05e8\x05d9"
+    , regex "אחרי"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -348,7 +330,7 @@
 ruleInDuration = Rule
   { name = "in <duration>"
   , pattern =
-    [ regex "\x05d1\x05e2\x05d5\x05d3"
+    [ regex "בעוד"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -360,7 +342,7 @@
 ruleInNamedmonth = Rule
   { name = "in <named-month>"
   , pattern =
-    [ regex "\x05d1"
+    [ regex "ב"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -372,7 +354,7 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "\x05e2\x05db\x05e9\x05d9\x05d5|\x05de\x05d9\x05d9\x05d3"
+    [ regex "עכשיו|מייד"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -382,7 +364,7 @@
   { name = "current <day-of-week>"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "(\x05d4\x05d6\x05d4|\x05d4\x05d6\x05d0\x05ea|\x05d4\x05e7\x05e8\x05d5\x05d1(\x05d4)?)"
+    , regex "(הזה|הזאת|הקרוב(ה)?)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -394,9 +376,9 @@
 ruleFromDatetimeDatetimeInterval = Rule
   { name = "from <datetime> - <datetime> (interval)"
   , pattern =
-    [ regex "\x05de|\x05de\x05e9\x05e2\x05d4"
+    [ regex "מ|משעה"
     , dimension Time
-    , regex "\\-|\x05e2\x05d3"
+    , regex "\\-|עד"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -409,7 +391,7 @@
 ruleNamedday4 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "(\x05d9\x05d5\x05dd )?\x05e8\x05d1\x05d9\x05e2\x05d9"
+    [ regex "(יום )?רביעי"
     ]
   , prod = \_ -> tt $ dayOfWeek 3
   }
@@ -418,9 +400,9 @@
 ruleTheCycleAfterTime = Rule
   { name = "the <cycle> after <time>"
   , pattern =
-    [ regex "\x05d4"
+    [ regex "ה"
     , dimension TimeGrain
-    , regex "\x05d0\x05d7\x05e8\x05d9"
+    , regex "אחרי"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -433,9 +415,9 @@
 ruleTheCycleBeforeTime = Rule
   { name = "the <cycle> before <time>"
   , pattern =
-    [ regex "\x05d4"
+    [ regex "ה"
     , dimension TimeGrain
-    , regex "\x05dc\x05e4\x05e0\x05d9"
+    , regex "לפני"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -449,7 +431,7 @@
   { name = "last <day-of-week>"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "(\x05e9\x05e2\x05d1\x05e8(\x05d4)?|\x05d4\x05e7\x05d5\x05d3\x05de\x05ea|\x05d4\x05e7\x05d5\x05d3\x05dd)"
+    , regex "(שעבר(ה)?|הקודמת|הקודם)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -461,7 +443,7 @@
 ruleTheIdesOfNamedmonth = Rule
   { name = "the ides of <named-month>"
   , pattern =
-    [ regex "\x05d1\x05d0\x05de\x05e6\x05e2"
+    [ regex "באמצע"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -475,7 +457,7 @@
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "(\x05d1)?\x05e6\x05d4\x05e8\x05d9\x05d9\x05dd"
+    [ regex "(ב)?צהריים"
     ]
   , prod = \_ -> tt $ hour False 12
   }
@@ -484,7 +466,7 @@
 ruleToday = Rule
   { name = "today"
   , pattern =
-    [ regex "\x05d4\x05d9\x05d5\x05dd"
+    [ regex "היום"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 0
   }
@@ -493,9 +475,9 @@
 ruleBetweenTimeofdayAndTimeofdayInterval = Rule
   { name = "between <time-of-day> and <time-of-day> (interval)"
   , pattern =
-    [ regex "\x05d1\x05d9\x05df"
+    [ regex "בין"
     , Predicate isATimeOfDay
-    , regex "\x05dc"
+    , regex "ל"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -509,36 +491,18 @@
   { name = "next <cycle>"
   , pattern =
     [ dimension TimeGrain
-    , regex "\x05d4\x05d1\x05d0(\x05d4)?"
+    , regex "הבא(ה)?"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) -> tt $ cycleNth grain 1
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05d9\x05e0\x05d5\x05d0\x05e8"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05de\x05e8\x05e5"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleForDuration :: Rule
 ruleForDuration = Rule
   { name = "for <duration>"
   , pattern =
-    [ regex "\x05ea\x05d5\x05da"
+    [ regex "תוך"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -552,7 +516,7 @@
   { name = "<duration> from now"
   , pattern =
     [ dimension Duration
-    , regex "\x05de\x05e2\x05db\x05e9\x05d9\x05d5"
+    , regex "מעכשיו"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -564,7 +528,7 @@
 ruleLunch = Rule
   { name = "lunch"
   , pattern =
-    [ regex "(\x05d1)?\x05e6\x05d4\x05e8\x05d9\x05d9\x05dd"
+    [ regex "(ב)?צהריים"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 12) (hour False 14)
@@ -575,7 +539,7 @@
   { name = "last <cycle>"
   , pattern =
     [ dimension TimeGrain
-    , regex "\x05d4\x05d0\x05d7\x05e8\x05d5\x05df|\x05d4\x05d0\x05d7\x05e8\x05d5\x05e0\x05d4|\x05e9\x05e2\x05d1\x05e8|\x05e9\x05e2\x05d1\x05e8\x05d4"
+    , regex "האחרון|האחרונה|שעבר|שעברה"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) ->
@@ -587,21 +551,12 @@
 ruleAfternoon = Rule
   { name = "afternoon"
   , pattern =
-    [ regex "\x05d0\x05d7\x05d4(\x05f4)?\x05e6|\x05d0\x05d7\x05e8 \x05d4\x05e6\x05d4\x05e8\x05d9\x05d9\x05dd"
+    [ regex "אחה(״)?צ|אחר הצהריים"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 12) (hour False 19)
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05d0\x05e4\x05e8\x05d9\x05dc"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleNamedmonthDayofmonthOrdinal :: Rule
 ruleNamedmonthDayofmonthOrdinal = Rule
   { name = "<named-month> <day-of-month> (ordinal)"
@@ -618,7 +573,7 @@
 ruleNamedday5 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "(\x05d9\x05d5\x05dd )?\x05d7\x05de\x05d9\x05e9\x05d9"
+    [ regex "(יום )?חמישי"
     ]
   , prod = \_ -> tt $ dayOfWeek 4
   }
@@ -654,7 +609,7 @@
   , pattern =
     [ dimension Ordinal
     , dimension Time
-    , regex "\x05d0\x05d7\x05e8\x05d9"
+    , regex "אחרי"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -681,7 +636,7 @@
 ruleAfterDuration = Rule
   { name = "after <duration>"
   , pattern =
-    [ regex "\x05d0\x05d7\x05e8\x05d9"
+    [ regex "אחרי"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -707,7 +662,7 @@
   { name = "<day-of-month> (ordinal) of <named-month>"
   , pattern =
     [ Predicate isDOMOrdinal
-    , regex "\x05e9\x05dc|\x05d1|\x05dc"
+    , regex "של|ב|ל"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -715,20 +670,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05e4\x05d1\x05e8\x05d5\x05d0\x05e8"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleThisEvening :: Rule
 ruleThisEvening = Rule
   { name = "this evening"
   , pattern =
-    [ regex "\x05d4\x05e2\x05e8\x05d1"
+    [ regex "הערב"
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 18) (hour False 0)
@@ -739,9 +685,9 @@
 ruleBetweenDatetimeAndDatetimeInterval = Rule
   { name = "between <datetime> and <datetime> (interval)"
   , pattern =
-    [ regex "\x05d1\x05d9\x05df"
+    [ regex "בין"
     , dimension Time
-    , regex "\x05dc"
+    , regex "ל"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -754,7 +700,7 @@
 ruleEndOfYear = Rule
   { name = "End of year"
   , pattern =
-    [ regex "\x05e1\x05d5\x05e3 (\x05d4)?\x05e9\x05e0\x05d4"
+    [ regex "סוף (ה)?שנה"
     ]
   , prod = \_ -> tt $ cycleNth TG.Year 1
   }
@@ -763,7 +709,7 @@
 ruleDurationAgo = Rule
   { name = "<duration> ago"
   , pattern =
-    [ regex "\x05dc\x05e4\x05e0\x05d9"
+    [ regex "לפני"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -778,7 +724,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
-    , regex "\x05d0\x05d7\x05e8\x05d5\x05df|\x05d0\x05d7\x05e8\x05d5\x05e0\x05d5\x05ea|\x05d0\x05d7\x05e8\x05d5\x05e0\x05d4|\x05d0\x05d7\x05e8\x05d5\x05e0\x05d9\x05dd"
+    , regex "אחרון|אחרונות|אחרונה|אחרונים"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -791,7 +737,7 @@
 ruleMidnighteodendOfDay = Rule
   { name = "midnight|EOD|end of day"
   , pattern =
-    [ regex "(\x05d1)?\x05d7\x05e6\x05d5\x05ea"
+    [ regex "(ב)?חצות"
     ]
   , prod = \_ -> tt $ hour False 0
   }
@@ -824,7 +770,7 @@
 ruleUntilTimeofday = Rule
   { name = "until <time-of-day>"
   , pattern =
-    [ regex "\x05e2\x05d3"
+    [ regex "עד"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -837,7 +783,7 @@
 ruleAtTimeofday = Rule
   { name = "at <time-of-day>"
   , pattern =
-    [ regex "\x05d1"
+    [ regex "ב"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -845,22 +791,13 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05d9\x05d5\x05e0\x05d9"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
   , pattern =
     [ dimension Time
     , dimension Ordinal
-    , regex "\x05e9\x05dc|\x05d1"
+    , regex "של|ב"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -869,15 +806,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05d0\x05d5\x05d2\x05d5\x05e1\x05d8"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -894,12 +822,9 @@
 ruleWeekend = Rule
   { name = "week-end"
   , pattern =
-    [ regex "(\x05e1\x05d5\x05e4\x05f4\x05e9|\x05e1\x05d5\x05e3 \x05d4\x05e9\x05d1\x05d5\x05e2)"
+    [ regex "(סופ״ש|סוף השבוע)"
     ]
-  , prod = \_ -> do
-      fri <- intersect (dayOfWeek 5) (hour False 18)
-      mon <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open fri mon
+  , prod = \_ -> tt weekend
   }
 
 ruleNameddayDayofmonthOrdinal :: Rule
@@ -918,7 +843,7 @@
 ruleDate = Rule
   { name = "ב <date>"
   , pattern =
-    [ regex "\x05d1"
+    [ regex "ב"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -931,7 +856,7 @@
   { name = "next <time>"
   , pattern =
     [ Predicate isNotLatent
-    , regex "\x05d4\x05d1\x05d0(\x05d4)?"
+    , regex "הבא(ה)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ predNth 0 True td
@@ -971,10 +896,10 @@
 ruleTheOrdinalCycleAfterTime = Rule
   { name = "the <ordinal> <cycle> after <time>"
   , pattern =
-    [ regex "\x05d4"
+    [ regex "ה"
     , dimension Ordinal
     , dimension TimeGrain
-    , regex "\x05d0\x05d7\x05e8\x05d9|\x05dc\x05d0\x05d7\x05e8"
+    , regex "אחרי|לאחר"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -989,7 +914,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
-    , regex "\x05d4\x05d1\x05d0|\x05d4\x05d1\x05d0\x05d4|\x05d4\x05d1\x05d0\x05d9\x05dd|\x05d4\x05d1\x05d0\x05d5\x05ea"
+    , regex "הבא|הבאה|הבאים|הבאות"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -1002,7 +927,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "(\x05d1)?\x05d1\x05d5\x05e7\x05e8"
+    [ regex "(ב)?בוקר"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 4) (hour False 12)
@@ -1013,7 +938,7 @@
   { name = "this <cycle>"
   , pattern =
     [ dimension TimeGrain
-    , regex "\x05d4\x05e7\x05e8\x05d5(\x05d1)?\x05d4|\x05d4\x05d6\x05d4|\x05d4\x05d6\x05d0\x05ea"
+    , regex "הקרו(ב)?ה|הזה|הזאת"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) ->
@@ -1026,7 +951,7 @@
   { name = "this <time>"
   , pattern =
     [ dimension Time
-    , regex "\x05d4\x05e7\x05e8\x05d5\x05d1|\x05d4\x05d6\x05d4"
+    , regex "הקרוב|הזה"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -1039,7 +964,7 @@
   { name = "<day-of-month> (non ordinal) of <named-month>"
   , pattern =
     [ Predicate isDOMInteger
-    , regex "\x05e9\x05dc|\x05d1|\x05dc"
+    , regex "של|ב|ל"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -1051,7 +976,7 @@
 ruleEndOfMonth = Rule
   { name = "End of month"
   , pattern =
-    [ regex "\x05e1\x05d5\x05e3 (\x05d4)?\x05d7\x05d5\x05d3\x05e9"
+    [ regex "סוף (ה)?חודש"
     ]
   , prod = \_ -> tt $ cycleNth TG.Month 1
   }
@@ -1060,7 +985,7 @@
 ruleYesterday = Rule
   { name = "yesterday"
   , pattern =
-    [ regex "(\x05d0\x05ea\x05de\x05d5\x05dc|\x05d0\x05de\x05e9)"
+    [ regex "(אתמול|אמש)"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -1069,7 +994,7 @@
 ruleAfterTimeofday = Rule
   { name = "after <time-of-day>"
   , pattern =
-    [ regex "\x05d0\x05d7\x05e8\x05d9"
+    [ regex "אחרי"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1109,7 +1034,7 @@
   , pattern =
     [ dimension Ordinal
     , dimension TimeGrain
-    , regex "\x05d0\x05d7\x05e8\x05d9|\x05dc\x05d0\x05d7\x05e8"
+    , regex "אחרי|לאחר"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1118,20 +1043,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05de\x05d0\x05d9"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
 ruleNamedday7 :: Rule
 ruleNamedday7 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "(\x05d9\x05d5\x05dd )?\x05e9\x05d1\x05ea"
+    [ regex "(יום )?שבת"
     ]
   , prod = \_ -> tt $ dayOfWeek 6
   }
@@ -1155,7 +1071,7 @@
   { name = "<time> of <part-of-day>"
   , pattern =
     [ dimension Time
-    , regex "\x05d1"
+    , regex "ב"
     , Predicate isAPartOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1176,15 +1092,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05d0\x05d5\x05e7\x05d8\x05d5\x05d1\x05e8"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleNamedmonthDayofmonthNonOrdinal :: Rule
 ruleNamedmonthDayofmonthNonOrdinal = Rule
   { name = "<named-month> <day-of-month> (non ordinal)"
@@ -1201,7 +1108,7 @@
 ruleNamedday8 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "(\x05d9\x05d5\x05dd )?\x05e8\x05d0\x05e9\x05d5\x05df"
+    [ regex "(יום )?ראשון"
     ]
   , prod = \_ -> tt $ dayOfWeek 7
   }
@@ -1223,7 +1130,7 @@
   { name = "last <day-of-week> of <time>"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "\x05d4\x05d0\x05d7\x05e8\x05d5\x05df \x05e9\x05dc"
+    , regex "האחרון של"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1253,7 +1160,7 @@
   { name = "<cycle> before <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "\x05dc\x05e4\x05e0\x05d9"
+    , regex "לפני"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1262,21 +1169,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05e0\x05d5\x05d1\x05de\x05d1\x05e8"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleDurationAfterTime :: Rule
 ruleDurationAfterTime = Rule
   { name = "<duration> after <time>"
   , pattern =
     [ dimension Duration
-    , regex "\x05d0\x05d7\x05e8\x05d9|\x05dc\x05d0\x05d7\x05e8"
+    , regex "אחרי|לאחר"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1289,7 +1187,7 @@
 ruleEveningnight = Rule
   { name = "evening|night"
   , pattern =
-    [ regex "(\x05d1)?\x05e2\x05e8\x05d1"
+    [ regex "(ב)?ערב"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 18) (hour False 0)
@@ -1314,7 +1212,7 @@
 ruleNamedday3 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "(\x05d9\x05d5\x05dd )?\x05e9\x05dc\x05d9\x05e9\x05d9"
+    [ regex "(יום )?שלישי"
     ]
   , prod = \_ -> tt $ dayOfWeek 2
   }
@@ -1323,7 +1221,7 @@
 ruleTheDayofmonthOrdinal = Rule
   { name = "the <day-of-month> (ordinal)"
   , pattern =
-    [ regex "\x05d4"
+    [ regex "ה"
     , Predicate isDOMOrdinal
     ]
   , prod = \tokens -> case tokens of
@@ -1338,7 +1236,7 @@
   { name = "<duration> before <time>"
   , pattern =
     [ dimension Duration
-    , regex "\x05dc\x05e4\x05e0\x05d9"
+    , regex "לפני"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1351,9 +1249,9 @@
 rulePartofdayOfTime = Rule
   { name = "<part-of-day> of <time>"
   , pattern =
-    [ regex "\x05d1"
+    [ regex "ב"
     , Predicate isAPartOfDay
-    , regex "\x05e9\x05dc"
+    , regex "של"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1380,7 +1278,7 @@
 ruleTomorrow = Rule
   { name = "tomorrow"
   , pattern =
-    [ regex "(\x05de\x05d7\x05e8|\x05dc\x05de\x05d7\x05e8\x05ea)"
+    [ regex "(מחר|למחרת)"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -1397,15 +1295,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x05e1\x05e4\x05d8\x05de\x05d1\x05e8"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -1437,6 +1326,31 @@
       _ -> Nothing
   }
 
+months :: [(Text, String)]
+months =
+  [ ( "ינואר", "ינואר" )
+  , ( "פברואר", "פברואר" )
+  , ( "מרץ", "מרץ" )
+  , ( "אפריל", "אפריל" )
+  , ( "מאי", "מאי" )
+  , ( "יוני", "יוני" )
+  , ( "יולי", "יולי" )
+  , ( "אוגוסט", "אוגוסט" )
+  , ( "ספטמבר", "ספטמבר" )
+  , ( "אוקטובר", "אוקטובר" )
+  , ( "נובמבר", "נובמבר" )
+  , ( "דצמבר", "דצמבר" )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 rules :: [Rule]
 rules =
   [ ruleAbsorptionOfAfterNamedDay
@@ -1499,18 +1413,6 @@
   , ruleNamedday7
   , ruleNamedday8
   , ruleNameddayDayofmonthOrdinal
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
   , ruleNextCycle
@@ -1554,3 +1456,4 @@
   , ruleYesterday
   , ruleYyyymmdd
   ]
+  ++ ruleMonths
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
@@ -8,12 +8,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.HR.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month)
@@ -21,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -433,7 +434,7 @@
   , examples (datetime (2015, 2, 0, 0, 0, 0) Month)
              [ "za dvije godine"
              ]
-  , examples (datetime (2013, 12, 0, 0, 0, 0) Month)
+  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
              [ "jednu godinu poslije Bozica"
              ]
   , examples (datetimeInterval ((2013, 6, 21, 0, 0, 0), (2013, 9, 24, 0, 0, 0)) Day)
diff --git a/Duckling/Time/HR/Rules.hs b/Duckling/Time/HR/Rules.hs
--- a/Duckling/Time/HR/Rules.hs
+++ b/Duckling/Time/HR/Rules.hs
@@ -11,7 +11,7 @@
 module Duckling.Time.HR.Rules
   ( rules ) where
 
-import Control.Monad (join, liftM2)
+import Control.Monad (join)
 import Data.Maybe
 import Data.String
 import Data.Text (Text)
@@ -31,24 +31,51 @@
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "ponedjelja?ka?|pon\\.?"
-    ]
-  , prod = \_ -> Just . Token Time $ dayOfWeek 1
-  }
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Monday"   , "ponedjelja?ka?|pon\\.?"                )
+  , ( "Tuesday"  , "utora?ka?|uto?\\.?"                    )
+  , ( "Wednesday", "srijed(a|e|u)|sri\\.?"                 )
+  , ( "Thursday" , "(č|c)etvrta?ka?|(č|c)et\\.?" )
+  , ( "Friday"   , "peta?ka?|pet\\.?"                      )
+  , ( "Saturday" , "subot(a|e|u)|sub?\\.?"                 )
+  , ( "Sunday"   , "nedjelj(a|e|u)|ned\\.?"                )
+  ]
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "prosina?c(a|u)?|decemba?r(a|u)?|dec\\.?|pros?\\.?|dvanaest(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 12
-  }
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
 
+months :: [(Text, String)]
+months =
+  [ ( "January"  , "sije(c|č)a?nj(a|u)?|januar(a|u)?|jan\\.?|sij?\\.?|prv(i|a|o(ga?)?)"                )
+  , ( "February" , "(ve)?lja(c|č)(a|e|i)|februar(a|u)?|feb\\.?|ve(lj)?\\.?|drug(i|a|o(ga?)?)"          )
+  , ( "March"    , "o(z|ž)uja?k(a|u)?|mart(a|u)?|mar\\.?|o(z|ž)u?\\.?|tre(c|ć)(i|a|e(ga?)?)" )
+  , ( "April"    , "trava?nj(a|u)?|april(a|u)?|apr\\.?|tra\\.?|(č|c)etvrt(i|a|o(ga?)?)"                )
+  , ( "May"      , "sviba?nj(a|u)?|maj|svi\\.?|pet(i|a|o(ga?)?)"                                            )
+  , ( "June"     , "lipa?nj(a|u)?|jun(i|u|a)?|jun\\.?|lip?\\.?|(š|s)est(i|a|o(ga?)?)"                  )
+  , ( "July"     , "srpa?nj(a|u)?|jul(i|u|a)?|jul\\.?|srp\\.?|sedm(i|a|o(ga?)?)"                            )
+  , ( "August"   , "kolovoz(a|u)?|august(a|u)?|aug\\.?|kol\\.?|osm(i|a|o(ga?)?)"                            )
+  , ( "September", "ruja?n(a|u)?|septemba?r(a|u)?|sept?\\.?|ruj\\.?|devet(i|a|o(ga?)?)"                     )
+  , ( "October"  , "listopad(a|u)?|oktobar(a|u)?|okt\\.?|lis\\.?|deset(i|a|o(ga?)?)"                        )
+  , ( "November" , "studen(i|oga?|om)|novemba?r(a|u)?|nov\\.?|stu\\.?|jedanaest(i|a|o(ga?)?)"               )
+  , ( "December" , "prosina?c(a|u)?|decemba?r(a|u)?|dec\\.?|pros?\\.?|dvanaest(i|a|o(ga?)?)"                )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleHalfIntegerHrStyleHourofday :: Rule
 ruleHalfIntegerHrStyleHourofday = Rule
   { name = "half <integer> (HR style hour-of-day)"
@@ -81,7 +108,7 @@
 ruleQuarterTotillbeforeIntegerHourofday = Rule
   { name = "quarter to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "(kvarata?|(c|\x010d)etvrt|frtalj)\\s+do"
+    [ regex "(kvarata?|(c|č)etvrt|frtalj)\\s+do"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -121,7 +148,7 @@
 ruleQuarterAfterpastHourofday = Rule
   { name = "quarter after|past (hour-of-day)"
   , pattern =
-    [ regex "(kvarata?|(c|\x010d)etvrt|frtalj)\\s+(poslije|nakon)"
+    [ regex "(kvarata?|(c|č)etvrt|frtalj)\\s+(poslije|nakon)"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -145,7 +172,7 @@
 ruleHourofdayNumeral = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -162,7 +189,7 @@
   { name = "<hour-of-day> quarter"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "kvarata?|(c|\x010d)etvrt|frtalj"
+    , regex "kvarata?|(c|č)etvrt|frtalj"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
@@ -205,7 +232,7 @@
 ruleZaQuarterHourofday = Rule
   { name = "za quarter (hour-of-day)"
   , pattern =
-    [ regex "za\\s+(kvarata?|(c|\x010d)etvrt|frtalj)"
+    [ regex "za\\s+(kvarata?|(c|č)etvrt|frtalj)"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -229,15 +256,6 @@
       _ -> Nothing
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "utora?ka?|uto?\\.?"
-    ]
-  , prod = \_ -> Just . Token Time $ dayOfWeek 2
-  }
-
 ruleValentinesDay :: Rule
 ruleValentinesDay = Rule
   { name = "valentine's day"
@@ -272,7 +290,7 @@
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
-    [ regex "(prethodn(i|u|a|e|o(ga?)?)|pro(s|\x0161)l(ih?|u|a|e|o(ga?)?))"
+    [ regex "(prethodn(i|u|a|e|o(ga?)?)|pro(s|š)l(ih?|u|a|e|o(ga?)?))"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -281,15 +299,6 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "subot(a|e|u)|sub?\\.?"
-    ]
-  , prod = \_ -> Just . Token Time $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -304,15 +313,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "srpa?nj(a|u)?|jul(i|u|a)?|jul\\.?|srp\\.?|sedm(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 7
-  }
-
 ruleCycleAfterTime :: Rule
 ruleCycleAfterTime = Rule
   { name = "<cycle> after <time>"
@@ -367,7 +367,7 @@
 ruleFromDatetimeDatetimeInterval = Rule
   { name = "from <datetime> - <datetime> (interval)"
   , pattern =
-    [ regex "od|izme(dj|\x0111)u"
+    [ regex "od|izme(dj|đ)u"
     , dimension Time
     , regex "\\-"
     , dimension Time
@@ -401,20 +401,11 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "(\x010d|c)etvrta?ka?|(\x010d|c)et\\.?"
-    ]
-  , prod = \_ -> Just . Token Time $ dayOfWeek 4
-  }
-
 ruleSeason4 :: Rule
 ruleSeason4 = Rule
   { name = "season"
   , pattern =
-    [ regex "prolje(c|\x0107)(e|a)"
+    [ regex "prolje(c|ć)(e|a)"
     ]
   , prod = \_ ->
       Token Time <$> interval TTime.Open (monthDay 3 20) (monthDay 6 21)
@@ -438,7 +429,7 @@
   { name = "<time> after next"
   , pattern =
     [ dimension Time
-    , regex "nakon sljede(\x0107|c)(i|e|a)(ga?)?"
+    , regex "nakon sljede(ć|c)(i|e|a)(ga?)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> Just . Token Time $ predNth 1 True td
@@ -468,7 +459,7 @@
 ruleToday = Rule
   { name = "today"
   , pattern =
-    [ regex "danas?|(dana(s|\x0161)nj(i|eg) dana?) "
+    [ regex "danas?|(dana(s|š)nj(i|eg) dana?) "
     ]
   , prod = \_ -> Just . Token Time $ cycleNth TG.Day 0
   }
@@ -477,7 +468,7 @@
 ruleThisnextDayofweek = Rule
   { name = "this|next <day-of-week>"
   , pattern =
-    [ regex "ov(aj?|og?|e)|sljede(c|\x0107)(i|u|a|e(ga?)?)"
+    [ regex "ov(aj?|og?|e)|sljede(c|ć)(i|u|a|e(ga?)?)"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -489,7 +480,7 @@
 ruleBetweenTimeofdayAndTimeofdayInterval = Rule
   { name = "between <time-of-day> and <time-of-day> (interval)"
   , pattern =
-    [ regex "od|izme(dj|\x0111)u"
+    [ regex "od|izme(dj|đ)u"
     , Predicate isATimeOfDay
     , regex "do|i"
     , Predicate isATimeOfDay
@@ -504,7 +495,7 @@
 ruleNextCycle = Rule
   { name = "next <cycle>"
   , pattern =
-    [ regex "sljede(c|\x0107)(i|a|u|e(ga?)?)"
+    [ regex "sljede(c|ć)(i|a|u|e(ga?)?)"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -512,15 +503,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "sije(c|\x010d)a?nj(a|u)?|januar(a|u)?|jan\\.?|sij?\\.?|prv(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 1
-  }
-
 ruleTimeofdayApproximately :: Rule
 ruleTimeofdayApproximately = Rule
   { name = "<time-of-day> approximately"
@@ -533,20 +515,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "o(z|\x017e)uja?k(a|u)?|mart(a|u)?|mar\\.?|o(z|\x017e)u?\\.?|tre(c|\x0107)(i|a|e(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 3
-  }
-
 ruleForDuration :: Rule
 ruleForDuration = Rule
   { name = "for <duration>"
   , pattern =
-    [ regex "za( jo(s|\x0161))?|u"
+    [ regex "za( jo(s|š))?|u"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -574,7 +547,7 @@
   { name = "<duration> from now"
   , pattern =
     [ dimension Duration
-    , regex "od (sada?|ovog trenutka|dana(s|\x0161)nj(i|eg) dana?)"
+    , regex "od (sada?|ovog trenutka|dana(s|š)nj(i|eg) dana?)"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) -> Just . Token Time $ inDuration dd
@@ -585,7 +558,7 @@
 ruleLunch = Rule
   { name = "lunch"
   , pattern =
-    [ regex "(((za )|(u vrijeme )) )?ru(c|\x010d)a?k(a|om)?"
+    [ regex "(((za )|(u vrijeme )) )?ru(c|č)a?k(a|om)?"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 12) (hour False 14)
@@ -595,7 +568,7 @@
 ruleLastCycle = Rule
   { name = "last <cycle>"
   , pattern =
-    [ regex "prethodn(i|a|e|u)|pro(s|\x0161)l(i|a|e|u|o(ga?)?)"
+    [ regex "prethodn(i|a|e|u)|pro(s|š)l(i|a|e|u|o(ga?)?)"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -627,21 +600,12 @@
       interval TTime.Open (hour False 12) (hour False 20)
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "trava?nj(a|u)?|april(a|u)?|apr\\.?|tra\\.?|(\x010d|c)etvrt(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 4
-  }
-
 ruleTimeBeforeLast :: Rule
 ruleTimeBeforeLast = Rule
   { name = "<time> before last"
   , pattern =
     [ dimension Time
-    , regex "prije (prethodn(e|o(ga?)?)|pro(s|\x0161)l(ih?|u|a|e|o(ga?)?))"
+    , regex "prije (prethodn(e|o(ga?)?)|pro(s|š)l(ih?|u|a|e|o(ga?)?))"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -653,7 +617,7 @@
 ruleLateNight = Rule
   { name = "late night"
   , pattern =
-    [ regex "(((u|po)\\s)?no(c|\x0107)(i|as|u)?|u?jutros?)"
+    [ regex "(((u|po)\\s)?no(c|ć)(i|as|u)?|u?jutros?)"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 0) (hour False 4)
@@ -692,15 +656,6 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "peta?ka?|pet\\.?"
-    ]
-  , prod = \_ -> Just . Token Time $ dayOfWeek 5
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -745,7 +700,7 @@
 ruleAfterDuration = Rule
   { name = "after <duration>"
   , pattern =
-    [ regex "(nakon|poslije)( jo(s|\x0161))?"
+    [ regex "(nakon|poslije)( jo(s|š))?"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -794,20 +749,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "(ve)?lja(c|\x010d)(a|e|i)|februar(a|u)?|feb\\.?|ve(lj)?\\.?|drug(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 2
-  }
-
 ruleExactlyTimeofday :: Rule
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
   , pattern =
-    [ regex "to(c|\x010d)no( u)?"
+    [ regex "to(c|č)no( u)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -851,7 +797,7 @@
 ruleBetweenDatetimeAndDatetimeInterval = Rule
   { name = "between <datetime> and <datetime> (interval)"
   , pattern =
-    [ regex "od|izme(dj|\x0111)u"
+    [ regex "od|izme(dj|đ)u"
     , dimension Time
     , regex "do|i"
     , dimension Time
@@ -914,7 +860,7 @@
 ruleLastNCycle = Rule
   { name = "last n <cycle>"
   , pattern =
-    [ regex "prethodn(ih?|a|e)|pro(s|\x0161)l(a|e|ih?)"
+    [ regex "prethodn(ih?|a|e)|pro(s|š)l(a|e|ih?)"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -942,7 +888,7 @@
 ruleMidnighteodendOfDay = Rule
   { name = "midnight|EOD|end of day"
   , pattern =
-    [ regex "(u )?pono(c|\x0107)i?|(the )?(EOD|((do )? kraja? dana))"
+    [ regex "(u )?pono(c|ć)i?|(the )?(EOD|((do )? kraja? dana))"
     ]
   , prod = \_ -> Just . Token Time $ hour False 0
   }
@@ -1007,15 +953,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "lipa?nj(a|u)?|jun(i|u|a)?|jun\\.?|lip?\\.?|(\x0161|s)est(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -1031,15 +968,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "kolovoz(a|u)?|august(a|u)?|aug\\.?|kol\\.?|osm(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -1058,10 +986,7 @@
   , pattern =
     [ regex "(za )?vikenda?"
     ]
-  , prod = \_ -> do
-      fri <- intersect (dayOfWeek 5) (hour False 18)
-      mon <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open fri mon
+  , prod = \_ -> tt weekend
   }
 
 rulePrijeDuration :: Rule
@@ -1113,7 +1038,7 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "sljede(c|\x0107)(i|u|a|e(ga?)?)"
+    [ regex "sljede(c|ć)(i|u|a|e(ga?)?)"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -1155,7 +1080,7 @@
 ruleNextNCycle = Rule
   { name = "next n <cycle>"
   , pattern =
-    [ regex "(u )?(sljede(c|\x0107)(ih?|a|eg?))"
+    [ regex "(u )?(sljede(c|ć)(ih?|a|eg?))"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -1256,7 +1181,7 @@
 ruleDayBeforeYesterday = Rule
   { name = "day before yesterday"
   , pattern =
-    [ regex "(prekju(c|\x010d)er)"
+    [ regex "(prekju(c|č)er)"
     ]
   , prod = \_ -> Just . Token Time . cycleNth TG.Day $ - 2
   }
@@ -1265,7 +1190,7 @@
 ruleAfterLunch = Rule
   { name = "after lunch"
   , pattern =
-    [ regex "poslije ru(c|\x010d)ka"
+    [ regex "poslije ru(c|č)ka"
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 13) (hour False 17)
@@ -1278,7 +1203,7 @@
   { name = "year (latent)"
   , pattern =
     [ Predicate $
-       liftM2 (||) (isIntegerBetween (- 10000) 0) (isIntegerBetween 25 999)
+       or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
     ]
   , prod = \tokens -> case tokens of
      (token:_) -> do
@@ -1291,7 +1216,7 @@
 ruleYesterday = Rule
   { name = "yesterday"
   , pattern =
-    [ regex "(ju(c|\x010d)er)"
+    [ regex "(ju(c|č)er)"
     ]
   , prod = \_ -> Just . Token Time . cycleNth TG.Day $ - 1
   }
@@ -1322,7 +1247,7 @@
 ruleChristmas = Rule
   { name = "christmas"
   , pattern =
-    [ regex "(zi(c|\x0107)bo|bo(z|\x017e)i(c|\x0107))(a|u|ni|na)?"
+    [ regex "(zi(c|ć)bo|bo(z|ž)i(c|ć))(a|u|ni|na)?"
     ]
   , prod = \_ -> Just . Token Time $ monthDay 12 25
   }
@@ -1375,7 +1300,7 @@
 ruleAfterNextTime = Rule
   { name = "after next <time>"
   , pattern =
-    [ regex "nakon sljede(\x0107|c)(i|e|a)(ga?)?"
+    [ regex "nakon sljede(ć|c)(i|e|a)(ga?)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1383,24 +1308,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "sviba?nj(a|u)?|maj|svi\\.?|pet(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "nedjelj(a|e|u)|ned\\.?"
-    ]
-  , prod = \_ -> Just . Token Time $ dayOfWeek 7
-  }
-
 ruleDayAfterTomorrow :: Rule
 ruleDayAfterTomorrow = Rule
   { name = "day after tomorrow"
@@ -1428,7 +1335,7 @@
 ruleTonight = Rule
   { name = "tonight"
   , pattern =
-    [ regex "(na)?ve(c|\x010d)er(as)?"
+    [ regex "(na)?ve(c|č)er(as)?"
     ]
   , prod = \_ -> do
       let today = cycleNth TG.Day 0
@@ -1440,7 +1347,7 @@
 ruleBeforeLasttime = Rule
   { name = "before last<time>"
   , pattern =
-    [ regex "prije (prethodn(i|u|a|e|o(ga?)?)|pro(s|\x0161)l(ih?|a|e|o(ga?)?))"
+    [ regex "prije (prethodn(i|u|a|e|o(ga?)?)|pro(s|š)l(ih?|a|e|o(ga?)?))"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1452,7 +1359,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) (isGrainFinerThan TG.Day) isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isGrainFinerThan TG.Day]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1475,20 +1382,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "listopad(a|u)?|oktobar(a|u)?|okt\\.?|lis\\.?|deset(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 10
-  }
-
 ruleHalloweenDay :: Rule
 ruleHalloweenDay = Rule
   { name = "halloween day"
   , pattern =
-    [ regex "no(c|\x0107) vje(s|\x0161)tica"
+    [ regex "no(c|ć) vje(s|š)tica"
     ]
   , prod = \_ -> Just . Token Time $ monthDay 10 31
   }
@@ -1521,9 +1419,9 @@
 ruleFathersDay = Rule
   { name = "Father's Day"
   , pattern =
-    [ regex "dan (o(c|\x010d)eva|tata)"
+    [ regex "dan (o(c|č)eva|tata)"
     ]
-  , prod = \_ -> tt $ nthDOWOfMonth 2 7 6
+  , prod = \_ -> tt $ nthDOWOfMonth 3 7 6
   }
 
 ruleByTime :: Rule
@@ -1572,7 +1470,7 @@
 ruleTimeofdayTimeofdayInterval = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isNotLatent isATimeOfDay
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\-|:"
     , Predicate isATimeOfDay
     ]
@@ -1582,15 +1480,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "studen(i|oga?|om)|novemba?r(a|u)?|nov\\.?|stu\\.?|jedanaest(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 11
-  }
-
 ruleDurationAfterTime :: Rule
 ruleDurationAfterTime = Rule
   { name = "<duration> after <time>"
@@ -1609,7 +1498,7 @@
 ruleEveningnight = Rule
   { name = "evening|night"
   , pattern =
-    [ regex "(na)?ve(c|\x010d)er(i|as)?"
+    [ regex "(na)?ve(c|č)er(i|as)?"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 18) (hour False 0)
@@ -1634,20 +1523,11 @@
 ruleDayBeforeDayBeforeYesterday = Rule
   { name = "day before day before yesterday"
   , pattern =
-    [ regex "(prek\\s?prekju(c|\x010d)er)"
+    [ regex "(prek\\s?prekju(c|č)er)"
     ]
   , prod = \_ -> Just . Token Time . cycleNth TG.Day $ - 3
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "srijed(a|e|u)|sri\\.?"
-    ]
-  , prod = \_ -> Just . Token Time $ dayOfWeek 3
-  }
-
 ruleDurationBeforeTime :: Rule
 ruleDurationBeforeTime = Rule
   { name = "<duration> before <time>"
@@ -1684,9 +1564,9 @@
 ruleMothersDay = Rule
   { name = "Mother's Day"
   , pattern =
-    [ regex "maj(c|\x010d)in dan"
+    [ regex "maj(c|č)in dan"
     ]
-  , prod = \_ -> tt $ nthDOWOfMonth 1 7 5
+  , prod = \_ -> tt $ nthDOWOfMonth 2 7 5
   }
 
 ruleTimeofdayOclock :: Rule
@@ -1715,15 +1595,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "ruja?n(a|u)?|septemba?r(a|u)?|sept?\\.?|ruj\\.?|devet(i|a|o(ga?)?)"
-    ]
-  , prod = \_ -> Just . Token Time $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -1821,26 +1692,7 @@
   , ruleMonthDdddInterval
   , ruleMorning
   , ruleMothersDay
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
   , ruleNameddayDayofmonthOrdinal
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
   , ruleNewYearsDay
@@ -1902,3 +1754,5 @@
   , ruleZaQuarterHourofday
   , ruleZaHalfHourofday
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
diff --git a/Duckling/Time/HU/Corpus.hs b/Duckling/Time/HU/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/HU/Corpus.hs
@@ -0,0 +1,176 @@
+-- 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.Time.HU.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+import Duckling.Testing.Types hiding (examples)
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale HU Nothing}, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 2, 12, 4, 30, 0) Second)
+             [ "most"
+             , "épp most"
+             ]
+  , examples (datetime (2013, 2, 12, 0, 0, 0) Day)
+             [ "ma"
+             ]
+  , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
+             [ "holnap"
+             ]
+  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+             [ "holnapután"
+             ]
+  , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
+             [ "tegnap"
+             ]
+  , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
+             [ "tegnapelőtt"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "hónap vége"
+             , "a hónap vége"
+             ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
+             [ "év vége"
+             , "az év vége"
+             ]
+  , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
+             [ "hétfő"
+             , "hét"
+             , "hét."
+             ]
+  , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
+             [ "kedd"
+             ]
+  , examples (datetime (2013, 2, 17, 0, 0, 0) Day)
+             [ "vasárnap"
+             , "vas"
+             , "vas."
+             ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Month)
+             [ "január"
+             , "jan"
+             , "jan."
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "március"
+             , "már"
+             , "már."
+             , "márc"
+             , "márc"
+             ]
+  , examples (datetime (2013, 3, 15, 0, 0, 0) Day)
+             [ "március 15"
+             , "már 15"
+             , "már. 15"
+             , "márc 15"
+             , "márc. 15"
+             ]
+  , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
+             [ "következő hónap"
+             , "jövő hónap"
+             ]
+  , examples (datetime (2012, 1, 1, 0, 0, 0) Year)
+             [ "előző év"
+             , "múlt év"
+             ]
+  , examples (datetime (2013, 2, 21, 0, 0, 0) Day)
+             [ "jövő csütörtök"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 20, 0) Minute)
+             [ "15:20"
+             ]
+  , examples (datetime (2013, 2, 12, 8, 20, 0) Minute)
+             [ "08:20"
+             , "8:20"
+             ]
+  , examples (datetime (2013, 2, 12, 15, 20, 44) Second)
+             [ "15:20:44"
+             ]
+  , examples (datetime (2013, 2, 12, 8, 20, 44) Second)
+             [ "08:20:44"
+             , "8:20:44"
+             ]
+  , examples (datetime (2013, 2, 12, 11, 0, 0) Hour)
+             [ "de 11"
+             , "de. 11"
+             , "délelőtt 11"
+             ]
+  , examples (datetime (2013, 2, 12, 23, 0, 0) Hour)
+             [ "du 11"
+             , "du. 11"
+             , "délután 11"
+             ]
+  , examples (datetime (2013, 2, 13, 23, 0, 0) Hour)
+             [ "szerda du 11"
+             , "szerda du. 11"
+             , "szerda délután 11"
+             ]
+  , examples (datetime (2013, 2, 20, 23, 0, 0) Hour)
+             [ "jövő szerda du 11"
+             , "jövő szerda du. 11"
+             , "jövő szerda délután 11"
+             ]
+  , examples (datetime (2013, 8, 20, 0, 0, 0) Day)
+             [ "2013.08.20"
+             , "2013 . 08 . 20"
+             , "2013-08-20"
+             , "2013 - 08 - 20"
+             ]
+  , examples (datetime (2013, 8, 20, 11, 45, 0) Minute)
+             [ "2013.08.20 11:45"
+             ]
+  , examples (datetime (2013, 8, 20, 17, 0, 0) Hour)
+             [ "2013.08.20 délután 5"
+             ]
+  , examples (datetime (2013, 8, 20, 0, 0, 0) Day)
+             [ "08.20"
+             , "08 . 20"
+             , "08-20"
+             , "08 - 20"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 6, 0, 0), (2013, 2, 12, 10, 0, 0)) Hour)
+             [ "ma reggel"
+             , "reggel"
+             ]
+  , examples (datetimeInterval ((2013, 2, 13, 8, 0, 0), (2013, 2, 13, 12, 0, 0)) Hour)
+             [ "holnap délelőtt"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 12, 0, 0), (2013, 2, 11, 13, 0, 0)) Hour)
+             [ "tegnap délben"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 18, 0, 0)) Hour)
+             [ "ma délután"
+             , "délután"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 16, 0, 0), (2013, 2, 12, 20, 0, 0)) Hour)
+             [ "ma este"
+             , "este"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 20, 0, 0), (2013, 2, 12, 23, 0, 0)) Hour)
+             [ "ma éjszaka"
+             , "éjszaka"
+             ]
+  , examples (datetimeInterval ((2013, 6, 21, 0, 0, 0), (2013, 9, 24, 0, 0, 0)) Day)
+             [ "nyár"
+             ]
+  ]
diff --git a/Duckling/Time/HU/Rules.hs b/Duckling/Time/HU/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/HU/Rules.hs
@@ -0,0 +1,325 @@
+-- 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.Time.HU.Rules
+  ( rules ) where
+
+import Data.Maybe
+import Data.String
+import Data.Text (Text)
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.Helpers (parseInt)
+import Duckling.Regex.Types
+import Duckling.Types
+import Duckling.Time.Helpers
+import qualified Duckling.Time.Types as TTime
+import qualified Duckling.TimeGrain.Types as TG
+
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect"
+  , pattern =
+    [ Predicate isNotLatent
+    , Predicate isNotLatent
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td1:Token Time td2:_) -> Token Time <$> intersect td1 td2
+      _ -> Nothing
+  }
+
+instants :: [(Text, String, TG.Grain, Int)]
+instants =
+  [ ("right now",            "((\x00E9pp )?most)|azonnal", TG.Second, 0  )
+  , ("today",                "ma",                         TG.Day,    0  )
+  , ("tomorrow",             "holnap",                     TG.Day,    1  )
+  , ("day after tomorrow",   "holnaput\x00E1n",            TG.Day,    2  )
+  , ("yesterday",            "tegnap",                     TG.Day,    -1 )
+  , ("day before yesterday", "tegnapel\x0151tt",           TG.Day,    -2 )
+  , ("end of month",         "(a )?h\x00F3nap v\x00E9ge",  TG.Month,  1  )
+  , ("end of year",          "(az )?\x00E9v v\x00E9ge",    TG.Year,   1  )
+  ]
+
+ruleInstants :: [Rule]
+ruleInstants = map go instants
+  where
+    go (name, regexPattern, grain, n) = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ cycleNth grain n
+      }
+
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Monday"   , "h\x00E9tf\x0151|h\x00E9t\\.?"           )
+  , ( "Tuesday"  , "kedd"                                   )
+  , ( "Wednesday", "szerda|szer\\.?"                        )
+  , ( "Thursday" , "cs\x00FCt\x00F6rt\x00F6k|cs\x00FCt\\.?" )
+  , ( "Friday"   , "p\x00E9ntek|p\x00E9n\\.?"               )
+  , ( "Saturday" , "szombat|szom\\.?"                       )
+  , ( "Sunday"   , "vas\x00E1rnap|vas\\.?"                  )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "January"  , "janu\x00E1r|jan\\.?"         )
+  , ( "February" , "febru\x00E1r|febr?\\.?"      )
+  , ( "March"    , "m\x00E1rcius|m\x00E1rc?\\.?" )
+  , ( "April"    , "\x00E1prilis|\x00E1pr\\.?"   )
+  , ( "May"      , "m\x00E1jus|m\x00E1j\\.?"     )
+  , ( "June"     , "j\x00FAnius|j\x00FAn\\.?"    )
+  , ( "July"     , "j\x00FAlius|j\x00FAl\\.?"    )
+  , ( "August"   , "augusztus|aug\\.?"           )
+  , ( "September", "szeptember|szept?\\.?"       )
+  , ( "October"  , "okt\x00F3ber|okt\\.?"        )
+  , ( "November" , "november|nov\\.?"            )
+  , ( "December" , "december|dec\\.?"            )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
+ruleMonthDOMNumeral :: Rule
+ruleMonthDOMNumeral = Rule
+  { name = "<named-month> <day-of-month> (non ordinal)"
+  , pattern =
+    [ Predicate isAMonth
+    , Predicate isDOMInteger
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:token:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
+ruleCycleThisLastNext :: Rule
+ruleCycleThisLastNext = Rule
+  { name = "this|last|next <cycle>"
+  , pattern =
+    [ regex "(most|el\x0151z\x0151|m\x00FAlt|k\x00F6vetkez\x0151|j\x00F6v\x0151)"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):Token TimeGrain grain:_) ->
+        case Text.toLower match of
+          "most"                -> tt $ cycleNth grain 0
+          "el\x0151z\x0151"     -> tt . cycleNth grain $ - 1
+          "m\x00FAlt"           -> tt . cycleNth grain $ - 1
+          "k\x00F6vetkez\x0151" -> tt $ cycleNth grain 1
+          "j\x00F6v\x0151"      -> tt $ cycleNth grain 1
+          _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleNextDOW :: Rule
+ruleNextDOW = Rule
+  { name = "next <day-of-week>"
+  , pattern =
+    [ regex "j\x00F6v\x0151"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) -> tt $ predNth 1 True td
+      _ -> Nothing
+  }
+
+ruleHHMM :: Rule
+ruleHHMM = Rule
+  { name = "hh:mm"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))[:.]([0-5]\\d)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (hh:mm:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        tt $ hourMinute True h m
+      _ -> Nothing
+  }
+
+ruleHHMMSS :: Rule
+ruleHHMMSS = Rule
+  { name = "hh:mm:ss"
+  , pattern =
+    [ regex "((?:[01]?\\d)|(?:2[0-3]))[:.]([0-5]\\d)[:.]([0-5]\\d)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (hh:mm:ss:_)):_) -> do
+        h <- parseInt hh
+        m <- parseInt mm
+        s <- parseInt ss
+        tt $ hourMinuteSecond True h m s
+      _ -> Nothing
+  }
+
+ruleTODLatent :: Rule
+ruleTODLatent = Rule
+  { name = "time-of-day (latent)"
+  , pattern =
+    [ Predicate $ and . sequence [isNumeralSafeToUse, isIntegerBetween 0 23]
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_) -> do
+        n <- getIntValue token
+        tt . mkLatent $ hour True n
+      _ -> Nothing
+  }
+
+ruleTODAM :: Rule
+ruleTODAM = Rule
+  { name = "am <time-of-day>"
+  , pattern =
+    [ regex "(de\\.?|d\x00E9lel\x0151tt)"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) ->
+        tt . timeOfDayAMPM td $ True
+      _ -> Nothing
+  }
+
+ruleTODPM :: Rule
+ruleTODPM = Rule
+  { name = "pm <time-of-day>"
+  , pattern =
+    [ regex "(du\\.?|d\x00E9lut\x00E1n)"
+    , Predicate isATimeOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) -> tt . timeOfDayAMPM td $ False
+      _ -> Nothing
+  }
+
+ruleYYYYMMDD :: Rule
+ruleYYYYMMDD = Rule
+  { name = "yyyy.mm.dd"
+  , pattern =
+    [ regex "(\\d{2,4})\\s?[-\\.]\\s?(0?[1-9]|1[0-2])\\s?[-\\.]\\s?(3[01]|[12]\\d|0?[1-9])"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (yy:mm:dd:_)):_) -> do
+        y <- parseInt yy
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ yearMonthDay y m d
+      _ -> Nothing
+  }
+
+ruleMMDD :: Rule
+ruleMMDD = Rule
+  { name = "mm.dd"
+  , pattern =
+    [ regex "(0?[1-9]|1[0-2])\\s?[-\\.]\\s?(3[01]|[12]\\d|0?[1-9])"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (mm:dd:_)):_) -> do
+        m <- parseInt mm
+        d <- parseInt dd
+        tt $ monthDay m d
+      _ -> Nothing
+  }
+
+rulePartOfDays :: Rule
+rulePartOfDays = Rule
+  { name = "part of days"
+  , pattern =
+    [ regex "(reggel|d\x00E9lel\x0151tt|d\x00E9lben|d\x00E9lut\x00E1n|este|\x00E9jszaka)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        let (start, end) = case Text.toLower match of
+              "reggel"             -> (hour False 6, hour False 10)
+              "d\x00E9lel\x0151tt" -> (hour False 08, hour False 12)
+              "d\x00E9lben"        -> (hour False 12, hour False 13)
+              "d\x00E9lut\x00E1n"  -> (hour False 12, hour False 18)
+              "este"               -> (hour False 16, hour False 20)
+              _                    -> (hour False 20, hour False 23)
+        td <- interval TTime.Open start end
+        tt . partOfDay $ td
+      _ -> Nothing
+  }
+
+-- Since part of days are latent, general time intersection is blocked
+ruleTimePOD :: Rule
+ruleTimePOD = Rule
+  { name = "<time> <part-of-day>"
+  , pattern =
+    [ dimension Time
+    , Predicate isAPartOfDay
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:Token Time pod:_) -> Token Time <$> intersect pod td
+      _ -> Nothing
+  }
+
+ruleSeasons :: Rule
+ruleSeasons = Rule
+  { name = "seasons"
+  , pattern =
+    [ regex "(ny\x00E1r|\x0151sz|t\x00E9l|tavasz)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        start <- case Text.toLower match of
+          "ny\x00E1r" -> Just $ monthDay 6 21
+          "\x0151sz"  -> Just $ monthDay 9 23
+          "t\x00E9l"  -> Just $ monthDay 12 21
+          "tavasz"    -> Just $ monthDay 3 20
+          _ -> Nothing
+        end <- case Text.toLower match of
+          "ny\x00E1r" -> Just $ monthDay 9 23
+          "\x0151sz"  -> Just $ monthDay 12 21
+          "t\x00E9l"  -> Just $ monthDay 3 20
+          "tavasz"    -> Just $ monthDay 6 21
+          _ -> Nothing
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleIntersect
+  , ruleMonthDOMNumeral
+  , ruleCycleThisLastNext
+  , ruleNextDOW
+  , ruleHHMM
+  , ruleHHMMSS
+  , ruleTODLatent
+  , ruleTODAM
+  , ruleTODPM
+  , ruleYYYYMMDD
+  , ruleMMDD
+  , rulePartOfDays
+  , ruleTimePOD
+  , ruleSeasons
+  ]
+  ++ ruleInstants
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
diff --git a/Duckling/Time/Helpers.hs b/Duckling/Time/Helpers.hs
--- a/Duckling/Time/Helpers.hs
+++ b/Duckling/Time/Helpers.hs
@@ -12,24 +12,22 @@
 
 module Duckling.Time.Helpers
   ( -- Patterns
-    isADayOfWeek, isAMonth, isAnHourOfDay, isAPartOfDay, isATimeOfDay
-  , isDOMInteger, isDOMOrdinal, isDOMValue, isGrain, isGrainFinerThan
-  , isGrainOfTime, isIntegerBetween, isNotLatent, isOrdinalBetween
-  , isMidnightOrNoon, isNumeralSafeToUse
+    hasNoDirection, isADayOfWeek, isAMonth, isAnHourOfDay, isAPartOfDay
+  , isATimeOfDay, isDOMInteger, isDOMOrdinal, isDOMValue, isGrain
+  , isGrainFinerThan, isGrainOfTime, isIntegerBetween, isNotLatent
+  , isOrdinalBetween, isMidnightOrNoon, isNumeralSafeToUse
     -- Production
   , cycleLastOf, cycleN, cycleNth, cycleNthAfter, dayOfMonth, dayOfWeek
-  , daysOfWeekOfMonth, durationAfter, durationAgo, durationBefore, form, hour
-  , hourMinute, hourMinuteSecond, inDuration, intersect, intersectDOM, interval
+  , durationAfter, durationAgo, durationBefore, form, hour, hourMinute
+  , hourMinuteSecond, inDuration, intersect, intersectDOM, interval
   , inTimezone, longWEBefore, minute, minutesAfter, minutesBefore, mkLatent
-  , month, monthDay, notLatent, nthDOWOfMonth, partOfDay, predLastOf, predNth
-  , predNthAfter, second, timeOfDayAMPM, weekend, withDirection, year
-  , yearMonthDay
-  , tt
+  , month, monthDay, notLatent, now, nthDOWOfMonth, partOfDay, predLastOf
+  , predNth, predNthAfter, second, timeOfDayAMPM, weekend, withDirection, year
+  , yearMonthDay, tt
     -- Other
   , getIntValue
   ) where
 
-import Control.Monad (liftM2)
 import Data.Maybe
 import Data.Text (Text)
 import Prelude
@@ -190,16 +188,23 @@
 timeCompose :: TTime.Predicate -> TTime.Predicate -> TTime.Predicate
 timeCompose pred1 pred2 = mkIntersectPredicate pred1 pred2
 
+addDuration :: DurationData -> TTime.TimeObject -> TTime.TimeObject
+addDuration (DurationData n g) t = TTime.timePlus t g $ toInteger n
+
+mergeDuration :: TTime.Predicate -> DurationData -> TTime.Predicate
+mergeDuration pred1 dd@(DurationData _ g) =
+  mkSeriesPredicate $! TTime.timeSeqMap False f pred1
+  where
+    f x@TTime.TimeObject{TTime.grain = tg} _ = Just $ addDuration dd t'
+      where
+        g' = min tg g
+        t' = if g' == tg then x else TTime.timeRound x g'
+
 shiftDuration :: TTime.Predicate -> DurationData -> TTime.Predicate
-shiftDuration pred1 (DurationData n g) =
+shiftDuration pred1 dd@(DurationData _ g) =
   mkSeriesPredicate $! TTime.timeSeqMap False f pred1
   where
-    grain = case g of
-      TG.Second -> TG.Second
-      TG.Year -> TG.Month
-      TG.Month -> TG.Day
-      _ -> pred g
-    f x _ = Just $ TTime.timePlus (TTime.timeRound x grain) g $ toInteger n
+    f x _ = Just . addDuration dd . TTime.timeRound x $ TG.lower g
 
 shiftTimezone :: Series.TimeZoneSeries -> TTime.Predicate -> TTime.Predicate
 shiftTimezone providedSeries pred1 =
@@ -269,6 +274,10 @@
 isNotLatent (Token Time td) = not $ TTime.latent td
 isNotLatent _ = False
 
+hasNoDirection :: Predicate
+hasNoDirection (Token Time td) = isNothing $ TTime.direction td
+hasNoDirection _ = False
+
 isIntegerBetween :: Int -> Int -> Predicate
 isIntegerBetween low high (Token Numeral nd) =
   TNumeral.isIntegerBetween (TNumeral.value nd) low high
@@ -290,7 +299,7 @@
 isDOMInteger = isIntegerBetween 1 31
 
 isDOMValue :: Predicate
-isDOMValue = liftM2 (||) isDOMOrdinal isDOMInteger
+isDOMValue = or . sequence [isDOMOrdinal, isDOMInteger]
 
 -- -----------------------------------------------------------------
 -- Production
@@ -320,6 +329,10 @@
       [] -> Nothing
       (x:_) -> Just x
 
+now :: TimeData
+now = td {TTime.timeGrain = TG.NoGrain}
+  where
+    td = cycleNth TG.Second 0
 
 hour :: Bool -> Int -> TimeData
 hour is12H n = timeOfDay (Just n) is12H $ TTime.timedata'
@@ -432,18 +445,24 @@
 durationAgo dd = inDuration $ timeNegPeriod dd
 
 durationAfter :: DurationData -> TimeData -> TimeData
-durationAfter dd TimeData {TTime.timePred = pred1} = TTime.timedata'
-  { TTime.timePred = shiftDuration pred1 dd
-  , TTime.timeGrain = TDuration.grain dd}
+durationAfter dd TimeData {TTime.timePred = pred1, TTime.timeGrain = g} =
+  TTime.timedata'
+    { TTime.timePred = if g == TG.NoGrain
+      then shiftDuration pred1 dd
+      else mergeDuration pred1 dd
+    , TTime.timeGrain = TDuration.grain dd
+    }
 
 durationBefore :: DurationData -> TimeData -> TimeData
 durationBefore dd pred1 = durationAfter (timeNegPeriod dd) pred1
 
 inDuration :: DurationData -> TimeData
 inDuration dd = TTime.timedata'
-  { TTime.timePred = shiftDuration (takeNth 0 False $ timeCycle TG.Second) dd
+  { TTime.timePred = shiftDuration t dd
   , TTime.timeGrain = TDuration.grain dd
   }
+  where
+    t = takeNth 0 False $ timeCycle TG.Second
 
 inTimezone :: Text -> TimeData -> Maybe TimeData
 inTimezone input td@TimeData {TTime.timePred = p} = do
@@ -491,16 +510,13 @@
     fri = intersect' (dayOfWeek 5, hour False 18)
     mon = intersect' (dayOfWeek 1, hour False 0)
 
-daysOfWeekOfMonth :: Int -> Int -> TimeData
-daysOfWeekOfMonth dow m = intersect' (dayOfWeek dow, month m)
-
 -- Zero-indexed weeks, Monday is 1
 -- Use `predLastOf` for last day of week of month
 nthDOWOfMonth :: Int -> Int -> Int -> TimeData
-nthDOWOfMonth n dow m = intersect' (dowsM, week)
+nthDOWOfMonth n dow m = predNthAfter (n - 1) dow_ month_
   where
-    dowsM = daysOfWeekOfMonth dow m
-    week = cycleNthAfter False TG.Week n $ monthDay m 1
+    dow_ = dayOfWeek dow
+    month_ = month m
 
 intersectDOM :: TimeData -> Token -> Maybe TimeData
 intersectDOM td token = do
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
@@ -13,10 +13,10 @@
   , negativeCorpus
   ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month)
@@ -24,13 +24,14 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = IT}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {lang = IT}, examples)
+negativeCorpus = (testContext {locale = makeLocale IT Nothing}, examples)
   where
     examples =
       [ "ma"
+      , "3 20"
       ]
 
 allExamples :: [Example]
@@ -79,6 +80,8 @@
              ]
   , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
              [ "Martedì"
+             , "Martedi"
+             , "mar"
              ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
              [ "Mercoledì"
@@ -94,6 +97,7 @@
              ]
   , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
              [ "giovedi"
+             , "giovedì"
              , "gio"
              ]
   , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
@@ -111,6 +115,16 @@
              , "dom"
              , "dom."
              ]
+   , examples (datetime (2013, 1, 1, 0, 0, 0) Month)
+              [ "gennaio 2013"
+              , "genn 2013"
+              , "genn. 2013"
+              ]
+  , examples (datetime (2013, 12, 1, 0, 0, 0) Month)
+              [ "dicembre 2013"
+              , "dic 2013"
+              , "dic. 2013"
+              ]
   , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
              [ "domenica 10 febbraio"
              ]
@@ -329,7 +343,7 @@
              , "tre e 20"
              , "3 e 20"
              , "3:20"
-             , "3 20"
+             , "alle 3 20"
              ]
   , examples (datetime (2013, 2, 12, 15, 30, 0) Minute)
              [ "15:30"
diff --git a/Duckling/Time/IT/Rules.hs b/Duckling/Time/IT/Rules.hs
--- a/Duckling/Time/IT/Rules.hs
+++ b/Duckling/Time/IT/Rules.hs
@@ -13,22 +13,22 @@
 module Duckling.Time.IT.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
-import qualified Data.Text as Text
+import Data.Text (Text)
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Numeral.Types (NumeralData(..))
-import qualified Duckling.Numeral.Types as TNumeral
 import Duckling.Ordinal.Types (OrdinalData(..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
 ruleFestaDellaRepubblica :: Rule
 ruleFestaDellaRepubblica = Rule
@@ -48,15 +48,6 @@
   , prod = \_ -> tt $ monthDay 1 6
   }
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "luned(i|\x00ec)|lun?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
-
 ruleDayofmonthNamedmonth :: Rule
 ruleDayofmonthNamedmonth = Rule
   { name = "<day-of-month> <named-month>"
@@ -128,15 +119,6 @@
       Token Time . partOfDay <$> intersect td1 td2
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "dicembre|dic\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleTheCycleNext :: Rule
 ruleTheCycleNext = Rule
   { name = "the <cycle> next"
@@ -184,15 +166,6 @@
       Token Time . partOfDay <$> intersect td1 td2
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "marted(i|\x00ec)|mar\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleYearNotLatent :: Rule
 ruleYearNotLatent = Rule
   { name = "year (1000-2100 not latent)"
@@ -404,15 +377,6 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "sabato|sab\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -427,15 +391,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "luglio|lug\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleEvening :: Rule
 ruleEvening = Rule
   { name = "evening"
@@ -453,7 +408,7 @@
 ruleDayOfMonthSt = Rule
   { name = "day of month (1st)"
   , pattern =
-    [ regex "(primo|1o|1\x00ba|1\x00b0)"
+    [ regex "(primo|1o|1º|1°)"
     ]
   , prod = \_ -> tt $ dayOfMonth 1
   }
@@ -558,7 +513,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -620,7 +575,7 @@
 ruleHhRelativeminutesDelPomeriggiotimeofday = Rule
   { name = "hh <relative-minutes> del pomeriggio(time-of-day)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     , regex "d(i|el(la)?) (pomeriggio|(sta)?(sera|notte))"
     ]
@@ -653,11 +608,12 @@
         tt $ hourMinute False h n
       _ -> Nothing
   }
+
 ruleHourofdayIntegerMinutes :: Rule
 ruleHourofdayIntegerMinutes = Rule
   { name = "<hour-of-day> <integer> minutes"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     , regex "min(ut[oi]|\\.)?"
     ]
@@ -1039,15 +995,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "gioved(i|\x00ec)|gio\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleSantoStefano :: Rule
 ruleSantoStefano = Rule
   { name = "santo stefano"
@@ -1073,7 +1020,7 @@
 ruleFestaDelPap = Rule
   { name = "festa del papà"
   , pattern =
-    [ regex "festa del pap(a|\x00e0)|(festa di )?s(an|\\.) giuseppe"
+    [ regex "festa del pap(a|à)|(festa di )?s(an|\\.) giuseppe"
     ]
   , prod = \_ -> tt $ monthDay 3 19
   }
@@ -1163,15 +1110,51 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "gennaio|genn?\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Lunedi"   , "luned(i|ì)|lun?\\.?"   )
+  , ( "Martedi"  , "marted(i|ì)|mar\\.?"   )
+  , ( "Mercoledi", "mercoled(i|ì)|mer\\.?" )
+  , ( "Giovedi"  , "gioved(i|ì)|gio\\.?"   )
+  , ( "Venerdi"  , "venerd(i|ì)|ven\\.?"   )
+  , ( "Sabato"   , "sabato|sab\\.?"             )
+  , ( "Domenica" , "domenica|dom\\.?"           )
+  ]
 
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "Gennaio"  , "gennaio|genn?\\.?"   )
+  , ( "Febbraio" , "febbraio|febb?\\.?"  )
+  , ( "Marzo"    , "marzo|mar\\.?"       )
+  , ( "Aprile"   , "aprile|apr\\.?"      )
+  , ( "Maggio"   , "maggio|magg?\\.?"    )
+  , ( "Giugno"   , "giugno|giu\\.?"      )
+  , ( "Luglio"   , "luglio|lug\\.?"      )
+  , ( "Agosto"   , "agosto|ago\\.?"      )
+  , ( "Settembre", "settembre|sett?\\.?" )
+  , ( "Ottobre"  , "ottobre|ott\\.?"     )
+  , ( "Novembre" , "novembre|nov\\.?"    )
+  , ( "Dicembre" , "dicembre|dic\\.?"    )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleTheCycleOfTime :: Rule
 ruleTheCycleOfTime = Rule
   { name = "the <cycle> of <time>"
@@ -1187,15 +1170,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "marzo|mar\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleLunch :: Rule
 ruleLunch = Rule
   { name = "lunch"
@@ -1251,15 +1225,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "aprile|apr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 rulePartofdayOfDimTime :: Rule
 rulePartofdayOfDimTime = Rule
   { name = "<part-of-day> of <dim time>"
@@ -1308,15 +1273,6 @@
   , prod = \_ -> tt $ monthDay 12 24
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "venerd(i|\x00ec)|ven\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleNthTimeAfterTime :: Rule
 ruleNthTimeAfterTime = Rule
   { name = "nth <time> after <time>"
@@ -1364,15 +1320,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "febbraio|febb?\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleStasera :: Rule
 ruleStasera = Rule
   { name = "stasera"
@@ -1566,15 +1513,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "giugno|giu\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -1590,15 +1528,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "agosto|ago\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleDalDatetimeAlDatetimeInterval :: Rule
 ruleDalDatetimeAlDatetimeInterval = Rule
   { name = "dal <datetime> al <datetime> (interval)"
@@ -1637,10 +1566,7 @@
   , pattern =
     [ regex "week[ -]?end|fine ?settimana|we"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleIlWeekendDelTime :: Rule
@@ -2108,24 +2034,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "maggio|magg?\\.?"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "domenica|dom\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleDalleTimeofdayAlleTimeofdayInterval :: Rule
 ruleDalleTimeofdayAlleTimeofdayInterval = Rule
   { name = "dalle <time-of-day> alle <time-of-day> (interval)"
@@ -2141,15 +2049,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "ottobre|ott\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleEntroLeTimeofday :: Rule
 ruleEntroLeTimeofday = Rule
   { name = "entro le <time-of-day>"
@@ -2242,15 +2141,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "novembre|nov\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleIleNCyclePassatipassate :: Rule
 ruleIleNCyclePassatipassate = Rule
   { name = "i|le n <cycle> passati|passate"
@@ -2267,15 +2157,6 @@
       _ -> Nothing
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mercoled(i|\x00ec)|mer\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleEoyendOfYear :: Rule
 ruleEoyendOfYear = Rule
   { name = "EOY|End of year"
@@ -2331,7 +2212,7 @@
   , pattern =
     [ regex "festa della mamma"
     ]
-  , prod = \_ -> tt $ nthDOWOfMonth 1 7 5
+  , prod = \_ -> tt $ nthDOWOfMonth 2 7 5
   }
 
 ruleFestaDelLavoro :: Rule
@@ -2357,20 +2238,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "settembre|sett?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleTimezone :: Rule
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -2444,26 +2316,7 @@
   , ruleMidnight
   , ruleMorning
   , ruleMothersDay
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
   , ruleNameddayDayofmonth
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNewYearsDay
   , ruleNewYearsEve
   , ruleNextCycle
@@ -2567,3 +2420,5 @@
   , ruleTraIlIntEIlInt
   , ruleIlWeekendDelTime
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -9,12 +9,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.KO.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month)
@@ -22,7 +23,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/KO/Rules.hs b/Duckling/Time/KO/Rules.hs
--- a/Duckling/Time/KO/Rules.hs
+++ b/Duckling/Time/KO/Rules.hs
@@ -13,27 +13,26 @@
 module Duckling.Time.KO.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
-import qualified Data.Text as Text
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData (..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
 ruleNamedday :: Rule
 ruleNamedday = Rule
   { name = "<named-day>에"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "\xc5d0"
+    , regex "에"
     ]
   , prod = \tokens -> case tokens of
       (x:_) -> Just x
@@ -44,7 +43,7 @@
 ruleLiberationDay = Rule
   { name = "Liberation Day"
   , pattern =
-    [ regex "\xad11\xbcf5\xc808"
+    [ regex "광복절"
     ]
   , prod = \_ -> tt $ monthDay 8 15
   }
@@ -53,7 +52,7 @@
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow - 내일모레"
   , pattern =
-    [ regex "(\xb0b4\xc77c)?\xbaa8\xb808"
+    [ regex "(내일)?모\xb808"
     ]
   , prod = \_ ->
       tt . cycleNthAfter False TG.Day 1 $ cycleNth TG.Day 1
@@ -63,7 +62,7 @@
 ruleConstitutionDay = Rule
   { name = "Constitution Day"
   , pattern =
-    [ regex "\xc81c\xd5cc\xc808"
+    [ regex "제헌절"
     ]
   , prod = \_ -> tt $ monthDay 6 17
   }
@@ -73,7 +72,7 @@
   { name = "<time-of-day>이전"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(\xc774)?\xc804"
+    , regex "(이)?전"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -86,7 +85,7 @@
   { name = "day"
   , pattern =
     [ Predicate isDOMInteger
-    , regex "\xc77c"
+    , regex "일"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -100,7 +99,7 @@
   { name = "since <time-of-day>"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "\xc774\xb798\xb85c"
+    , regex "이래로"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -112,7 +111,7 @@
 ruleThisDayofweek = Rule
   { name = "this <day-of-week>"
   , pattern =
-    [ regex "\xc774\xbc88(\xc8fc)?|\xae08\xc8fc"
+    [ regex "이번(주)?|금주"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -125,7 +124,7 @@
 ruleNewYearsDay = Rule
   { name = "New Year's Day"
   , pattern =
-    [ regex "\xc2e0\xc815|\xc124\xb0a0"
+    [ regex "신정|설날"
     ]
   , prod = \_ -> tt $ monthDay 1 1
   }
@@ -134,7 +133,7 @@
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
-    [ regex "\xc804|\xc800\xbc88|\xc9c0\xb09c"
+    [ regex "전|저번|지난"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -148,7 +147,7 @@
   { name = "<datetime> - <datetime> (interval)"
   , pattern =
     [ Predicate isNotLatent
-    , regex "\\-|\\~|\xbd80\xd130"
+    , regex "\\-|\\~|부터"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -162,7 +161,7 @@
   { name = "in <duration>"
   , pattern =
     [ dimension Duration
-    , regex "(\xc548|\xb0b4)(\xc5d0)?"
+    , regex "(안|내)(에)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -174,7 +173,7 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "\xbc29\xae08|\xc9c0\xae08|\xbc29\xae08|\xb9c9"
+    [ regex "방금|지금|방금|막"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -184,7 +183,7 @@
   { name = "month"
   , pattern =
     [ Predicate $ isIntegerBetween 1 12
-    , regex "\xc6d4"
+    , regex "월"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -197,7 +196,7 @@
 ruleSeason4 = Rule
   { name = "season"
   , pattern =
-    [ regex "\xbd04"
+    [ regex "봄"
     ]
   , prod = \_ ->
       let from = monthDay 3 20
@@ -235,7 +234,7 @@
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "\xc815\xc624"
+    [ regex "정오"
     ]
   , prod = \_ -> tt $ hour False 12
   }
@@ -244,7 +243,7 @@
 ruleToday = Rule
   { name = "today"
   , pattern =
-    [ regex "\xc624\xb298|\xb2f9\xc77c|\xae08\xc77c"
+    [ regex "오늘|당일|금일"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 0
   }
@@ -253,9 +252,9 @@
 ruleIntegerHourofdayRelativeMinutes = Rule
   { name = "<integer> (hour-of-day) relative minutes 전"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
-    , regex "\xbd84\xc804"
+    , regex "분전"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:token:_) -> do
@@ -269,9 +268,9 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
-    , regex "\xbd84"
+    , regex "분"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -287,7 +286,7 @@
   { name = "half (hour-of-day) relative minutes 전"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\xbc18\xc804"
+    , regex "반전"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> Token Time <$> minutesBefore 30 td
@@ -299,7 +298,7 @@
   { name = "<hour-of-day> half (as relative minutes)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\xbc18"
+    , regex "반"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -312,7 +311,7 @@
   { name = "seconds"
   , pattern =
     [ Predicate $ isIntegerBetween 0 59
-    , regex "\xcd08"
+    , regex "초"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -339,7 +338,7 @@
 ruleTheDayBeforeYesterday = Rule
   { name = "the day before yesterday - 엊그제"
   , pattern =
-    [ regex "(\xc5ca)?\xadf8(\xc81c|\xc7ac)"
+    [ regex "(엊)?그(제|재)"
     ]
   , prod = \_ ->
       tt . cycleNthAfter False TG.Day (-1) $ cycleNth TG.Day (-1)
@@ -349,17 +348,17 @@
 ruleDayofweek = Rule
   { name = "day-of-week"
   , pattern =
-    [ regex "(\xc6d4|\xd654|\xc218|\xbaa9|\xae08|\xd1a0|\xc77c)(\xc694\xc77c|\xc69c)"
+    [ regex "(월|화|수|목|금|토|일)(요일|욜)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\xc6d4" -> tt $ dayOfWeek 1
-        "\xd654" -> tt $ dayOfWeek 2
-        "\xc218" -> tt $ dayOfWeek 3
-        "\xbaa9" -> tt $ dayOfWeek 4
-        "\xae08" -> tt $ dayOfWeek 5
-        "\xd1a0" -> tt $ dayOfWeek 6
-        "\xc77c" -> tt $ dayOfWeek 7
+        "월" -> tt $ dayOfWeek 1
+        "화" -> tt $ dayOfWeek 2
+        "수" -> tt $ dayOfWeek 3
+        "목" -> tt $ dayOfWeek 4
+        "금" -> tt $ dayOfWeek 5
+        "토" -> tt $ dayOfWeek 6
+        "일" -> tt $ dayOfWeek 7
         _ -> Nothing
       _ -> Nothing
   }
@@ -368,7 +367,7 @@
 ruleNextCycle = Rule
   { name = "next <cycle>"
   , pattern =
-    [ regex "\xb2e4\xc74c|\xc624\xb294|\xcc28|\xb0b4"
+    [ regex "다음|오는|차|내"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -382,7 +381,7 @@
   { name = "<named-month>에"
   , pattern =
     [ Predicate isAMonth
-    , regex "\xc5d0"
+    , regex "에"
     ]
   , prod = \tokens -> case tokens of
       (x:_) -> Just x
@@ -394,7 +393,7 @@
   { name = "<time-of-day> approximately"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "\xc815\xb3c4|\xcbe4"
+    , regex "정도|쯤"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -405,7 +404,7 @@
 ruleDurationFromNow = Rule
   { name = "<duration> from now"
   , pattern =
-    [ regex "\xc9c0\xae08\xbd80\xd130"
+    [ regex "지금부터"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -418,7 +417,7 @@
 ruleLunch = Rule
   { name = "lunch"
   , pattern =
-    [ regex "\xc810\xc2ec"
+    [ regex "점심"
     ]
   , prod = \_ ->
       let from = hour False 12
@@ -431,7 +430,7 @@
 ruleLastCycle = Rule
   { name = "last <cycle>"
   , pattern =
-    [ regex "\xc9c0\xb09c|\xc791|\xc804|\xc800\xbc88"
+    [ regex "지난|작|전|저번"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -444,7 +443,7 @@
 ruleAfternoon = Rule
   { name = "afternoon"
   , pattern =
-    [ regex "\xc624\xd6c4"
+    [ regex "오후"
     ]
   , prod = \_ ->
       let from = hour False 12
@@ -457,7 +456,7 @@
 ruleChristmasEve = Rule
   { name = "christmas eve"
   , pattern =
-    [ regex "(\xd06c\xb9ac\xc2a4\xb9c8\xc2a4)?\xc774\xbe0c"
+    [ regex "(크리스마스)?이브"
     ]
   , prod = \_ -> tt $ monthDay 12 24
   }
@@ -467,7 +466,7 @@
   { name = "in|during the <part-of-day>"
   , pattern =
     [ Predicate isAPartOfDay
-    , regex "\xc5d0|\xb3d9\xc548"
+    , regex "에|동안"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -508,7 +507,7 @@
   { name = "after <duration>"
   , pattern =
     [ dimension Duration
-    , regex "(\xc774)?\xd6c4"
+    , regex "(이)?후"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -534,7 +533,7 @@
   { name = "exactly <time-of-day>"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "\xc815\xac01"
+    , regex "정각"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -545,7 +544,7 @@
 ruleSeason3 = Rule
   { name = "season"
   , pattern =
-    [ regex "\xaca8\xc6b8"
+    [ regex "겨울"
     ]
   , prod = \_ ->
       let from = monthDay 12 21
@@ -557,7 +556,7 @@
 ruleSeason = Rule
   { name = "season"
   , pattern =
-    [ regex "\xc5ec\xb984"
+    [ regex "여름"
     ]
   , prod = \_ ->
       let from = monthDay 6 21
@@ -569,24 +568,24 @@
 ruleDayWithKoreanNumeral = Rule
   { name = "day with korean number - 십일..삼십일일"
   , pattern =
-    [ regex "((\xc774|\xc0bc)?\xc2ed(\xc77c|\xc774|\xc0bc|\xc0ac|\xc624|\xc721|\xce60|\xd314|\xad6c)?)\xc77c"
+    [ regex "((이|삼)?십(일|이|삼|사|오|육|칠|팔|구)?)일"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (_:m1:m2:_)):_) ->
         let dozens = case m1 of
-              "\xc774" -> 2
-              "\xc0bc" -> 3
+              "이" -> 2
+              "삼" -> 3
               _        -> 1
             units = case m2 of
-              "\xc77c" -> 1
-              "\xc774" -> 2
-              "\xc0bc" -> 3
-              "\xc0ac" -> 4
-              "\xc624" -> 5
-              "\xc721" -> 6
-              "\xce60" -> 7
-              "\xd314" -> 8
-              "\xad6c" -> 9
+              "일" -> 1
+              "이" -> 2
+              "삼" -> 3
+              "사" -> 4
+              "오" -> 5
+              "육" -> 6
+              "칠" -> 7
+              "팔" -> 8
+              "구" -> 9
               _        -> 1
         in tt . dayOfMonth $ 10 * dozens + units
       _ -> Nothing
@@ -596,19 +595,19 @@
 ruleDayWithKoreanNumeral2 = Rule
   { name = "day with korean number - 일일..구일"
   , pattern =
-    [ regex "(\xc77c|\xc774|\xc0bc|\xc0ac|\xc624|\xc721|\xce60|\xd314|\xad6c)\xc77c"
+    [ regex "(일|이|삼|사|오|육|칠|팔|구)일"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> case match of
-        "\xc77c" -> tt $ dayOfMonth 1
-        "\xc774" -> tt $ dayOfMonth 2
-        "\xc0bc" -> tt $ dayOfMonth 3
-        "\xc0ac" -> tt $ dayOfMonth 4
-        "\xc624" -> tt $ dayOfMonth 5
-        "\xc721" -> tt $ dayOfMonth 6
-        "\xce60" -> tt $ dayOfMonth 7
-        "\xd314" -> tt $ dayOfMonth 8
-        "\xad6c" -> tt $ dayOfMonth 9
+        "일" -> tt $ dayOfMonth 1
+        "이" -> tt $ dayOfMonth 2
+        "삼" -> tt $ dayOfMonth 3
+        "사" -> tt $ dayOfMonth 4
+        "오" -> tt $ dayOfMonth 5
+        "육" -> tt $ dayOfMonth 6
+        "칠" -> tt $ dayOfMonth 7
+        "팔" -> tt $ dayOfMonth 8
+        "구" -> tt $ dayOfMonth 9
         _ -> Nothing
       _ -> Nothing
   }
@@ -618,7 +617,7 @@
   { name = "<time-of-day>에"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "\xc5d0"
+    , regex "에"
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
@@ -631,7 +630,7 @@
   { name = "<duration> ago"
   , pattern =
     [ dimension Duration
-    , regex "(\xc774)?\xc804"
+    , regex "(이)?전"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -643,7 +642,7 @@
 ruleLastNCycle = Rule
   { name = "last n <cycle>"
   , pattern =
-    [ regex "\xc9c0\xb09c"
+    [ regex "지난"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -675,7 +674,7 @@
   { name = "within <duration>"
   , pattern =
     [ dimension Duration
-    , regex "\xc774\xb0b4(\xc5d0)?"
+    , regex "이내(에)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -689,7 +688,7 @@
 ruleMidnighteodendOfDay = Rule
   { name = "midnight|EOD|end of day"
   , pattern =
-    [ regex "\xc790\xc815"
+    [ regex "자정"
     ]
   , prod = \_ -> tt $ hour False 0
   }
@@ -711,7 +710,7 @@
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "\xb300\xcda9|\xc57d"
+    [ regex "대충|약"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -724,7 +723,7 @@
   { name = "end of <time>"
   , pattern =
     [ dimension Time
-    , regex "\xb9d0"
+    , regex "말"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -749,12 +748,9 @@
 ruleWeekend = Rule
   { name = "week-end"
   , pattern =
-    [ regex "\xc8fc\xb9d0"
+    [ regex "주말"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleTimeDayofweek :: Rule
@@ -762,7 +758,7 @@
   { name = "<time> 마지막 <day-of-week>"
   , pattern =
     [ dimension Time
-    , regex "\xb9c8\xc9c0\xb9c9"
+    , regex "마지막"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -776,7 +772,7 @@
   { name = "<date>에"
   , pattern =
     [ dimension Time
-    , regex "\xc5d0"
+    , regex "에"
     ]
   , prod = \tokens -> case tokens of
       (x:_) -> Just x
@@ -787,7 +783,7 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "\xb2e4\xc74c|\xc624\xb294"
+    [ regex "다음|오는"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -801,7 +797,7 @@
   { name = "<time> 마지막 <cycle>"
   , pattern =
     [ dimension Time
-    , regex "\xb9c8\xc9c0\xb9c9"
+    , regex "마지막"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -829,7 +825,7 @@
 ruleNextNCycle = Rule
   { name = "next n <cycle>"
   , pattern =
-    [ regex "\xb2e4\xc74c"
+    [ regex "다음"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -844,7 +840,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "\xc544\xce68"
+    [ regex "아침"
     ]
   , prod = \_ ->
       let from = hour False 4
@@ -857,7 +853,7 @@
 ruleThisCycle = Rule
   { name = "this <cycle>"
   , pattern =
-    [ regex "\xc774\xbc88|\xae08|\xc62c"
+    [ regex "이번|금|올"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -870,7 +866,7 @@
 ruleThisTime = Rule
   { name = "this <time>"
   , pattern =
-    [ regex "\xc774\xbc88"
+    [ regex "이번"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -884,7 +880,7 @@
   { name = "<time-of-day> 정각"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "\xc815\xac01"
+    , regex "정각"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -896,7 +892,7 @@
 ruleMemorialDay = Rule
   { name = "Memorial Day"
   , pattern =
-    [ regex "\xd604\xcda9\xc77c"
+    [ regex "현충일"
     ]
   , prod = \_ -> tt $ monthDay 6 6
   }
@@ -918,7 +914,7 @@
 ruleYesterday = Rule
   { name = "yesterday"
   , pattern =
-    [ regex "\xc5b4\xc81c"
+    [ regex "어제"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -927,7 +923,7 @@
 ruleSeason2 = Rule
   { name = "season"
   , pattern =
-    [ regex "\xac00\xc744"
+    [ regex "가을"
     ]
   , prod = \_ ->
       let from = monthDay 9 23
@@ -939,8 +935,8 @@
 ruleAfterTimeofday = Rule
   { name = "after <time-of-day>"
   , pattern =
-    [ Predicate $ liftM2 (||) isATimeOfDay isAPartOfDay
-    , regex "\xc9c0\xb098\xc11c|(\xc774)?\xd6c4(\xc5d0)?"
+    [ Predicate $ or . sequence [isATimeOfDay, isAPartOfDay]
+    , regex "지나서|(이)?후(에)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -952,7 +948,7 @@
 ruleChristmas = Rule
   { name = "christmas"
   , pattern =
-    [ regex "\xd06c\xb9ac\xc2a4\xb9c8\xc2a4"
+    [ regex "크리스마스"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -975,7 +971,7 @@
   { name = "<time> 마지막 <cycle> "
   , pattern =
     [ dimension Time
-    , regex "\xb9c8\xc9c0\xb9c9"
+    , regex "마지막"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -993,7 +989,7 @@
   { name = "after <part-of-day>"
   , pattern =
     [ Predicate isAPartOfDay
-    , regex "\xc9c0\xb098\xc11c|\xd6c4\xc5d0"
+    , regex "지나서|후에"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -1006,7 +1002,7 @@
   { name = "time-of-day"
   , pattern =
     [ Predicate $ isIntegerBetween 0 24
-    , regex "\xc2dc"
+    , regex "시"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -1019,7 +1015,7 @@
 ruleHangulDay = Rule
   { name = "Hangul Day"
   , pattern =
-    [ regex "\xd55c\xae00\xb0a0"
+    [ regex "한글날"
     ]
   , prod = \_ -> tt $ monthDay 10 9
   }
@@ -1070,7 +1066,7 @@
 ruleChildrensDay = Rule
   { name = "Children's Day"
   , pattern =
-    [ regex "\xc5b4\xb9b0\xc774\xb0a0"
+    [ regex "어린이날"
     ]
   , prod = \_ -> tt $ monthDay 5 5
   }
@@ -1092,7 +1088,7 @@
   { name = "by <time> - 까지"
   , pattern =
     [ dimension Time
-    , regex "\xae4c\xc9c0"
+    , regex "까지"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> Token Time <$>
@@ -1135,8 +1131,8 @@
 ruleTimeofdayTimeofdayInterval = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
-    , regex "\\-|\\~|\xbd80\xd130"
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    , regex "\\-|\\~|부터"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1149,7 +1145,7 @@
 ruleNationalFoundationDay = Rule
   { name = "National Foundation Day"
   , pattern =
-    [ regex "\xac1c\xcc9c\xc808"
+    [ regex "개천절"
     ]
   , prod = \_ -> tt $ monthDay 10 3
   }
@@ -1158,7 +1154,7 @@
 ruleEveningnight = Rule
   { name = "evening|night"
   , pattern =
-    [ regex "\xc800\xb141|\xbc24"
+    [ regex "저녁|밤"
     ]
   , prod = \_ ->
       let from = hour False 18
@@ -1171,7 +1167,7 @@
 ruleIndependenceMovementDay = Rule
   { name = "Independence Movement Day"
   , pattern =
-    [ regex "\xc0bc\xc77c\xc808"
+    [ regex "삼일절"
     ]
   , prod = \_ -> tt $ monthDay 3 1
   }
@@ -1195,7 +1191,7 @@
 ruleTomorrow = Rule
   { name = "tomorrow"
   , pattern =
-    [ regex "\xb0b4\xc77c|\xba85\xc77c|\xb0bc"
+    [ regex "내일|명일|낼"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -1204,14 +1200,14 @@
 ruleAmpmTimeofday = Rule
   { name = "am|pm <time-of-day>"
   , pattern =
-    [ regex "(\xc624\xc804|\xc544\xce68|\xc624\xd6c4|\xc800\xb141)"
+    [ regex "(오전|아침|오후|저녁)"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):
        Token Time td:
        _) -> tt . timeOfDayAMPM td $
-         elem match ["\xc624\xc804", "\xc544\xce68"]
+         elem match ["오전", "아침"]
       _ -> Nothing
   }
 
@@ -1220,7 +1216,7 @@
   { name = "year"
   , pattern =
     [ Predicate $ isIntegerBetween 1 2100
-    , regex "\xb144"
+    , regex "년"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -1248,7 +1244,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
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
@@ -5,16 +5,16 @@
 -- 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.Time.NB.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month)
@@ -22,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = NB}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -408,7 +408,7 @@
   , examples (datetime (1954, 0, 0, 0, 0, 0) Year)
              [ "1954"
              ]
-  , examples (datetime (2013, 12, 0, 0, 0, 0) Month)
+  , examples (datetime (2013, 12, 24, 0, 0, 0) Day)
              [ "et år etter julaften"
              , "ett år etter julaften"
              ]
diff --git a/Duckling/Time/NB/Rules.hs b/Duckling/Time/NB/Rules.hs
--- a/Duckling/Time/NB/Rules.hs
+++ b/Duckling/Time/NB/Rules.hs
@@ -13,29 +13,20 @@
 module Duckling.Time.NB.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
+import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData (..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mandag|man\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
-
 ruleTheDayAfterTomorrow :: Rule
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow"
@@ -45,21 +36,12 @@
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "desember|des\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
   , pattern =
     [ Predicate $ isIntegerBetween 1 59
-    , regex "p\x00e5"
+    , regex "på"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -92,7 +74,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -108,7 +90,7 @@
 ruleQuarterTotillbeforeIntegerHourofday = Rule
   { name = "quarter to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "(et)? ?(kvart)(er)? *p\x00e5"
+    [ regex "(et)? ?(kvart)(er)? *på"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -147,7 +129,7 @@
 ruleHalfTotillbeforeIntegerHourofday = Rule
   { name = "half to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "halv time *p\x00e5"
+    [ regex "halv time *på"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -191,15 +173,6 @@
   , prod = \_ -> tt $ monthDay 5 17
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "tirsdag|tirs?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleValentinesDay :: Rule
 ruleValentinesDay = Rule
   { name = "valentine's day"
@@ -245,7 +218,7 @@
 ruleNewYearsDay = Rule
   { name = "new year's day"
   , pattern =
-    [ regex "nytt\x00e5rsdag"
+    [ regex "nyttårsdag"
     ]
   , prod = \_ -> tt $ monthDay 1 1
   }
@@ -263,15 +236,6 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "l\x00f8rdag|l\x00f8r\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -286,15 +250,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juli|jul\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleEvening :: Rule
 ruleEvening = Rule
   { name = "evening"
@@ -353,7 +308,7 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "akkurat n\x00e5|n\x00e5|(i )?dette \x00f8yeblikk"
+    [ regex "akkurat nå|nå|(i )?dette øyeblikk"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -411,15 +366,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "torsdag|tors?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleTheCycleAfterTime :: Rule
 ruleTheCycleAfterTime = Rule
   { name = "the <cycle> after <time>"
@@ -439,7 +385,7 @@
   { name = "the <cycle> before <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "(en|tet|et)? f\x00f8r"
+    , regex "(en|tet|et)? før"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -524,7 +470,7 @@
 ruleTheDayBeforeYesterday = Rule
   { name = "the day before yesterday"
   , pattern =
-    [ regex "i forig\x00e5rs"
+    [ regex "i forigårs"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
@@ -557,15 +503,51 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "januar|jan\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Mandag"  , "mandag|man\\.?"    )
+  , ( "Tirsdag" , "tirsdag|tirs?\\.?" )
+  , ( "Onsdag"  , "onsdag|ons\\.?"    )
+  , ( "Torsdag" , "torsdag|tors?\\.?" )
+  , ( "Fredag"  , "fredag|fre\\.?"    )
+  , ( "Lørdag"  , "lørdag|lør\\.?"    )
+  , ( "Søndag"  , "søndag|søn\\.?"    )
+  ]
 
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "Januar"   , "januar|jan\\.?"      )
+  , ( "Februar"  , "februar|feb\\.?"     )
+  , ( "Mars"     , "mars|mar\\.?"        )
+  , ( "April"    , "april|apr\\.?"       )
+  , ( "Mai"      , "mai"                 )
+  , ( "Juni"     , "juni|jun\\.?"        )
+  , ( "Juli"     , "juli|jul\\.?"        )
+  , ( "August"   , "august|aug\\.?"      )
+  , ( "September", "september|sept?\\.?" )
+  , ( "Oktober"  , "oktober|okt\\.?"     )
+  , ( "November" , "november|nov\\.?"    )
+  , ( "Desember" , "desember|des\\.?"    )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleTheCycleOfTime :: Rule
 ruleTheCycleOfTime = Rule
   { name = "the <cycle> of <time>"
@@ -596,7 +578,7 @@
 ruleOnDate = Rule
   { name = "on <date>"
   , pattern =
-    [ regex "den|p\x00e5"
+    [ regex "den|på"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -604,21 +586,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mars|mar\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleDurationFromNow :: Rule
 ruleDurationFromNow = Rule
   { name = "<duration> from now"
   , pattern =
     [ dimension Duration
-    , regex "fra (i dag|idag|n\x00e5)"
+    , regex "fra (i dag|idag|nå)"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -679,15 +652,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "april|apr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleTimeBeforeLast :: Rule
 ruleTimeBeforeLast = Rule
   { name = "<time> before last"
@@ -736,15 +700,6 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "fredag|fre\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -831,7 +786,7 @@
   , pattern =
     [ regex "(etter|fra)"
     , Predicate isATimeOfDay
-    , regex "((men )?f\x00f8r)|\\-|tilogmed|til"
+    , regex "((men )?før)|\\-|tilogmed|til"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -840,15 +795,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "februar|feb\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleExactlyTimeofday :: Rule
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
@@ -906,7 +852,7 @@
 ruleNewYearsEve = Rule
   { name = "new year's eve"
   , pattern =
-    [ regex "nytt\x00e5rsaften?"
+    [ regex "nyttårsaften?"
     ]
   , prod = \_ -> tt $ monthDay 12 31
   }
@@ -1051,7 +997,7 @@
 ruleUntilTimeofday = Rule
   { name = "until <time-of-day>"
   , pattern =
-    [ regex "(engang )?innen|f\x00f8r|opptil"
+    [ regex "(engang )?innen|før|opptil"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1073,15 +1019,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juni|jun\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -1097,15 +1034,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "august|aug\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -1125,10 +1053,7 @@
   , pattern =
     [ regex "((week(\\s|-)?end)|helg)(en|a)?"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleEomendOfMonth :: Rule
@@ -1256,7 +1181,7 @@
 ruleADuration = Rule
   { name = "a <duration>"
   , pattern =
-    [ regex "(om )?en|ett|\x00e9n|et"
+    [ regex "(om )?en|ett|én|et"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -1295,7 +1220,7 @@
 ruleThisCycle = Rule
   { name = "this <cycle>"
   , pattern =
-    [ regex "denne|dette|i|n\x00e5v\x00e6rende"
+    [ regex "denne|dette|i|nåværende"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -1346,7 +1271,7 @@
 ruleOnANamedday = Rule
   { name = "on a named-day"
   , pattern =
-    [ regex "p\x00e5 en"
+    [ regex "på en"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -1359,7 +1284,7 @@
   { name = "year (latent)"
   , pattern =
     [ Predicate $
-       liftM2 (||) (isIntegerBetween (- 10000) 0) (isIntegerBetween 25 999)
+       or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -1372,7 +1297,7 @@
 ruleYesterday = Rule
   { name = "yesterday"
   , pattern =
-    [ regex "i g\x00e5r|ig\x00e5r"
+    [ regex "i går|igår"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -1406,7 +1331,7 @@
 ruleChristmas = Rule
   { name = "christmas"
   , pattern =
-    [ regex "((1\\.?)|f\x00f8rste)? ?juledag"
+    [ regex "((1\\.?)|første)? ?juledag"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -1466,24 +1391,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mai"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "s\x00f8ndag|s\x00f8n\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleHhmm :: Rule
 ruleHhmm = Rule
   { name = "hh:mm"
@@ -1523,15 +1430,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "oktober|okt\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleHalloweenDay :: Rule
 ruleHalloweenDay = Rule
   { name = "halloween day"
@@ -1586,7 +1484,7 @@
   , pattern =
     [ regex "farsdag"
     ]
-  , prod = \_ -> tt $ nthDOWOfMonth 1 7 11
+  , prod = \_ -> tt $ nthDOWOfMonth 2 7 11
   }
 
 ruleCycleBeforeTime :: Rule
@@ -1594,7 +1492,7 @@
   { name = "<cycle> before <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "f\x00f8r"
+    , regex "før"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1622,7 +1520,7 @@
 ruleTimeofdayTimeofdayInterval = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\-|tilogmed|til"
     , Predicate isATimeOfDay
     ]
@@ -1632,15 +1530,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "november|nov\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleDurationAfterTime :: Rule
 ruleDurationAfterTime = Rule
   { name = "<duration> after <time>"
@@ -1670,15 +1559,6 @@
       _ -> Nothing
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "onsdag|ons\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleTheDayofmonthOrdinal :: Rule
 ruleTheDayofmonthOrdinal = Rule
   { name = "the <day-of-month> (ordinal)"
@@ -1697,7 +1577,7 @@
   { name = "<duration> before <time>"
   , pattern =
     [ dimension Duration
-    , regex "f\x00f8r"
+    , regex "før"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1744,7 +1624,7 @@
   , pattern =
     [ regex "morsdag"
     ]
-  , prod = \_ -> tt $ nthDOWOfMonth 1 7 2
+  , prod = \_ -> tt $ nthDOWOfMonth 2 7 2
   }
 
 ruleTimeofdayOclock :: Rule
@@ -1760,15 +1640,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "september|sept?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -1807,7 +1678,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1880,25 +1751,6 @@
   , ruleMonthDdddInterval
   , ruleMorning
   , ruleMothersDay
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
   , ruleNewYearsDay
@@ -1964,3 +1816,5 @@
   , ruleYyyymmdd
   , ruleTimezone
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -9,21 +9,38 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.PL.Corpus
-  ( corpus ) where
+  ( corpus
+  , negativeCorpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 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)
-import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = PL}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, allExamples)
 
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (testContext {locale = makeLocale PL Nothing}, examples)
+  where
+    examples =
+      [ "nie"
+      , "niez"
+      , "Za Herbatke"
+      , "za herbatke"
+      , "No nic"
+      , "no nic"
+      , "pierwszy"
+      , "drugiej"
+      , "trzecia piętnaście"
+      ]
+
 allExamples :: [Example]
 allExamples = concat
   [ examples (datetime (2013, 2, 12, 4, 30, 0) Second)
@@ -94,6 +111,8 @@
              , "ta niedziela"
              , "niedz"
              , "niedz."
+             , "nd"
+             , "ndz"
              ]
   , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
              [ "pierwszy marca"
@@ -339,6 +358,12 @@
              , "o trzeciej rano"
              , "o trzeciej z rana"
              ]
+  , examples (datetime (2013, 2, 12, 13, 0, 0) Hour)
+             [ "o pierwszy"
+             ]
+  , examples (datetime (2013, 2, 12, 14, 0, 0) Hour)
+             [ "o drugiej"
+             ]
   , examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
              [ "3:18 rano"
              ]
@@ -435,14 +460,14 @@
              [ "piętnaście po trzeciej"
              , "15 po trzeciej"
              , "kwadrans po 3"
-             , "trzecia piętnaście"
+             , "o trzecia piętnaście"
              , "15:15"
              ]
   , examples (datetime (2013, 2, 12, 15, 20, 0) Minute)
              [ "20 po 3"
              , "3:20"
              , "3:20 w poludnie"
-             , "trzecia dwadzieścia"
+             , "o trzecia dwadzieścia"
              ]
   , examples (datetime (2013, 2, 12, 15, 30, 0) Minute)
              [ "w pół do szesnastej"
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
@@ -13,20 +13,19 @@
 module Duckling.Time.PL.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
-import qualified Data.Text as Text
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData(..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
 ruleOrdinalCycleTime :: Rule
 ruleOrdinalCycleTime = Rule
@@ -42,24 +41,51 @@
       _ -> Nothing
   }
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "poniedzia(l|\x0142)(ek|ku|kowi|kiem|kowy)|pon\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
+daysOfWeek :: [(Text.Text, String)]
+daysOfWeek =
+  [ ( "Monday" , "poniedzia(l|ł)(ek|ku|kowi|kiem|kowy)|pon\\.?" )
+  , ( "Tuesday" , "wtorek|wtorku|wtorkowi|wtorkiem|wtr?\\.?" )
+  , ( "Wednesday" , "(Ś|ś|s)rod(a|ą|y|e|ę|zie|owy|o)|(s|ś|Ś)ro?\\.?" )
+  , ( "Thursday" , "czwartek|czwartku|czwartkowi|czwartkiem|czwr?\\.?" )
+  , ( "Friday" , "piątek|piatek|piątku|piatku|piątkowi|piatkowi|piątkiem|piatkiem|pi(ą|a)tkowy|pia\\.?" )
+  , ( "Saturday" , "sobota|soboty|sobocie|sobotę|sobote|sobotą|sobota|sobocie|soboto|sob\\.?" )
+  , ( "Sunday" , "niedziel(a|i|ę|e|ą|o)|n(ie)?dz?\\.?" )
+  ]
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "grudzie\x0144|grudzien|grudnia|grudniowi|grudniem|grudniu|gru\\.?|grud\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
 
+months :: [(Text.Text, String)]
+months =
+  [ ( "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\\.?" )
+  , ( "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\\.?" )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
@@ -98,7 +124,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -153,7 +179,7 @@
 ruleHalfTotillbeforeIntegerHourofday = Rule
   { name = "half to|till|before <integer> (hour-of-day)"
   , pattern =
-    [ regex "p(o|\x00f3)(l|\x0142) *(do|przed)"
+    [ regex "p(o|ó)(l|ł) *(do|przed)"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -165,7 +191,7 @@
 ruleHalfAfterpastIntegerHourofday = Rule
   { name = "half after|past <integer> (hour-of-day)"
   , pattern =
-    [ regex "p(o|\x00f3)(l|\x0142) *po"
+    [ regex "p(o|ó)(l|ł) *po"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -180,7 +206,7 @@
   { name = "<hour-of-day> half (as relative minutes)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "p(o|\x00f3)(l|\x0142)"
+    , regex "p(o|ó)(l|ł)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -188,15 +214,6 @@
       _ -> Nothing
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "wtorek|wtorku|wtorkowi|wtorkiem|wtr?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleValentinesDay :: Rule
 ruleValentinesDay = Rule
   { name = "valentine's day"
@@ -210,7 +227,7 @@
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
-    [ regex "ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej)?|(po ?)?przedni(ego|ch|emu|e|mi|m|a)?"
+    [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej)?|(po ?)?przedni(ego|ch|emu|e|mi|m|a)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -219,21 +236,12 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "sobota|soboty|sobocie|sobot\x0119|sobote|sobot\x0105|sobota|sobocie|soboto|sob\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
   , pattern =
     [ Predicate isNotLatent
-    , regex "\\-|(p|d)o|a(\x017c|z) (p|d)o"
+    , regex "\\-|(p|d)o|a(ż|z) (p|d)o"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -242,15 +250,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "lipiec|lipca|lipcowi|lipcem|lipcu|lip\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleCycleAfterTime :: Rule
 ruleCycleAfterTime = Rule
   { name = "<cycle> after <time>"
@@ -269,7 +268,7 @@
 ruleInDuration = Rule
   { name = "in <duration>"
   , pattern =
-    [ regex "(w( ?(prze)?ci\x0105gu)?|za) ?(jeszcze)?|przez"
+    [ regex "(w( ?(prze)?ciągu)?|za) ?(jeszcze)?|przez"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -282,7 +281,7 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "(w)? ?(tym|tej)? ?(teraz|momencie|chwili|mome\x0144cie)"
+    [ regex "(w)? ?(tym|tej)? ?(teraz|momencie|chwili|momeńcie)"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -291,7 +290,7 @@
 ruleLastCycleOfTime = Rule
   { name = "last <cycle> of <time>"
   , pattern =
-    [ regex "ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej)?"
+    [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej)?"
     , dimension TimeGrain
     , regex "w(e)?|z(e)?"
     , dimension Time
@@ -306,9 +305,9 @@
 ruleFromDatetimeDatetimeInterval = Rule
   { name = "from <datetime> - <datetime> (interval)"
   , pattern =
-    [ regex "od|p(o|\x00f3)(z|\x017a)niej ni(z|\x017c)"
+    [ regex "od|p(o|ó)(z|ź)niej ni(z|ż)"
     , dimension Time
-    , regex "\\-|do|po|a\x017c do|az do|a\x017c po|az po|ale przed"
+    , regex "\\-|do|po|aż do|az do|aż po|az po|ale przed"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -325,7 +324,7 @@
     ]
   , prod = \tokens -> case tokens of
       (Token Ordinal (OrdinalData {TOrdinal.value = v}):_) ->
-        tt $ hour True v
+        tt . mkLatent $ hour True v
       _ -> Nothing
   }
 
@@ -335,7 +334,7 @@
   , pattern =
     [ Predicate isAMonth
     , regex "(3[01]|[12]\\d|0?[1-9])"
-    , regex "\\-|do|po|a\x017c do|az do|a\x017c po|az po"
+    , regex "\\-|do|po|aż do|az do|aż po|az po"
     , regex "(3[01]|[12]\\d|0?[1-9])"
     ]
   , prod = \tokens -> case tokens of
@@ -352,20 +351,11 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "czwartek|czwartku|czwartkowi|czwartkiem|czwr?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleSeason4 :: Rule
 ruleSeason4 = Rule
   { name = "season"
   , pattern =
-    [ regex "wiosna|wiosny|wio\x015bnie|wiosnie|wiosn\x0119|wiosne|wiosn\x0105|wiosna|wio\x015bnie|wiosnie|wiosno"
+    [ regex "wiosna|wiosny|wiośnie|wiosnie|wiosnę|wiosne|wiosną|wiosna|wiośnie|wiosnie|wiosno"
     ]
   , prod = \_ ->
       let from = monthDay 3 20
@@ -391,7 +381,7 @@
   { name = "<time> after next"
   , pattern =
     [ dimension Time
-    , regex "po kolejnym|po nast(e|\x0119)pn(ym|y|ego|emu|(a|\x0105)|ej|e)|po przysz(l|\x0142)(ym|y|ego|emu|(a|\x0105)|ej)"
+    , regex "po kolejnym|po nast(e|ę)pn(ym|y|ego|emu|(a|ą)|ej|e)|po przysz(l|ł)(ym|y|ego|emu|(a|ą)|ej)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -417,7 +407,7 @@
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "po(l|\x0142)udni(em|e|a|u)"
+    [ regex "po(l|ł)udni(em|e|a|u)"
     ]
   , prod = \_ -> tt $ hour False 12
   }
@@ -426,7 +416,7 @@
 ruleToday = Rule
   { name = "today"
   , pattern =
-    [ regex "dzisiejszy|dzisiaj|dzi\x015b|dzis|w ten dzie\x0144|w ten dzien|w obecny dzie\x0144|w obecny dzien|obecnego dnia"
+    [ regex "dzisiejszy|dzisiaj|dziś|dzis|w ten dzień|w ten dzien|w obecny dzień|w obecny dzien|obecnego dnia"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 0
   }
@@ -435,7 +425,7 @@
 ruleThisnextDayofweek = Rule
   { name = "this|next <day-of-week>"
   , pattern =
-    [ regex "kolejn(ym|y|ego|emu|e)|nast(e|\x0119)pn(ym|y|ego|emu|e|(a|\x0105)|ej|e)"
+    [ regex "kolejn(ym|y|ego|emu|e)|nast(e|ę)pn(ym|y|ego|emu|e|(a|ą)|ej|e)"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -448,7 +438,7 @@
 ruleBetweenTimeofdayAndTimeofdayInterval = Rule
   { name = "between <time-of-day> and <time-of-day> (interval)"
   , pattern =
-    [ regex "(po|po )?miedzy|mi\x0119dzy"
+    [ regex "(po|po )?miedzy|między"
     , Predicate isATimeOfDay
     , regex "a|i"
     , Predicate isATimeOfDay
@@ -463,7 +453,7 @@
 ruleNextCycle = Rule
   { name = "next <cycle>"
   , pattern =
-    [ regex "kolejn(ym|y|ego|emu|(a|\x0105)|ej|e)|nast(e|\x0119)pn(ym|y|ego|emu|(a|\x0105)|ej|e)|przysz(l|\x0142)(ego|emu|ym|(a|\x0105)|ej|ych|i|ymi|y|e)|za"
+    [ regex "kolejn(ym|y|ego|emu|(a|ą)|ej|e)|nast(e|ę)pn(ym|y|ego|emu|(a|ą)|ej|e)|przysz(l|ł)(ego|emu|ym|(a|ą)|ej|ych|i|ymi|y|e)|za"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -472,15 +462,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "stycze\x0144|styczen|stycznia|styczniowi|styczniem|styczniu|sty(cz)?\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleTheCycleOfTime :: Rule
 ruleTheCycleOfTime = Rule
   { name = "the <cycle> of <time>"
@@ -501,7 +482,7 @@
   { name = "<time-of-day> approximately"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "o?ko(l|\x0142)o|mniej wi(e|\x0119)cej"
+    , regex "o?ko(l|ł)o|mniej wi(e|ę)cej"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -512,7 +493,7 @@
 rulePolishIndependenceDay = Rule
   { name = "Polish independence day"
   , pattern =
-    [ regex "(s|\x015b)wiet(a|o) niepodleg(l|\x0142)o(s|\x015b)ci|(\x015b|s)w\\.? niepodleg(l|\x0142)o(s|\x015b)ci"
+    [ regex "(s|ś)wiet(a|o) niepodleg(l|ł)o(s|ś)ci|(ś|s)w\\.? niepodleg(l|ł)o(s|ś)ci"
     ]
   , prod = \_ -> tt $ monthDay 11 11
   }
@@ -529,20 +510,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "marzec|marca|marcowi|marcem|marcu|marz?\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleLastDayofweekTime :: Rule
 ruleLastDayofweekTime = Rule
   { name = "last <day-of-week> <time>"
   , pattern =
-    [ regex "ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej)?"
+    [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej)?"
     , Predicate isADayOfWeek
     , dimension Time
     ]
@@ -557,7 +529,7 @@
   { name = "<duration> from now"
   , pattern =
     [ dimension Duration
-    , regex "od (dzi(s|\x015b)|teraz)"
+    , regex "od (dzi(s|ś)|teraz)"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -582,7 +554,7 @@
 ruleLastCycle = Rule
   { name = "last <cycle>"
   , pattern =
-    [ regex "ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej|e)?|(po ?)?przedni(ego|ch|emu|mi|m|e|(a|\x0105)|ej)?"
+    [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej|e)?|(po ?)?przedni(ego|ch|emu|mi|m|e|(a|ą)|ej)?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -595,7 +567,7 @@
 ruleAfternoon = Rule
   { name = "afternoon"
   , pattern =
-    [ regex "po(l|\x0142)udni(em|e|a|u)"
+    [ regex "po(l|ł)udni(em|e|a|u)"
     ]
   , prod = \_ ->
       let from = hour False 12
@@ -609,8 +581,8 @@
   { name = "<hour-of-day> - <hour-of-day> (interval)"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "-|do|a\x017c po|po"
-    , Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    , regex "-|do|aż po|po"
+    , Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     ]
   , prod = \tokens -> case tokens of
       (Token Time td1:_:Token Time td2:_) ->
@@ -618,21 +590,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "kwiecie\x0144|kwiecien|kwietnia|kwietniowi|kwietniem|kwietniu|kwiet?\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleTimeBeforeLast :: Rule
 ruleTimeBeforeLast = Rule
   { name = "<time> before last"
   , pattern =
     [ dimension Time
-    , regex "przed ?ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej)?"
+    , regex "przed ?ostatni(ego|ch|emu|mi|m|(a|ą)|ej)?"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -656,7 +619,7 @@
 ruleChristmasEve = Rule
   { name = "christmas eve"
   , pattern =
-    [ regex "(wigilia|wigilii|wigili(e|\x0119)|wigili(a|\x0105)|wigilio) ?(bo(z|\x017c)ego narodzenia)?"
+    [ regex "(wigilia|wigilii|wigili(e|ę)|wigili(a|ą)|wigilio) ?(bo(z|ż)ego narodzenia)?"
     ]
   , prod = \_ -> tt $ monthDay 12 24
   }
@@ -678,20 +641,11 @@
 ruleThanksgivingDay = Rule
   { name = "thanksgiving day"
   , pattern =
-    [ regex "((s|\x015b)wiet(a|o)|(dzie(n|\x0144)))? ?dzi(e|\x0119)kczynieni(e|a)"
+    [ regex "((s|ś)wiet(a|o)|(dzie(n|ń)))? ?dzi(e|ę)kczynieni(e|a)"
     ]
   , prod = \_ -> tt $ nthDOWOfMonth 4 4 11
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "pi\x0105tek|piatek|pi\x0105tku|piatku|pi\x0105tkowi|piatkowi|pi\x0105tkiem|piatkiem|pi(\x0105|a)tkowy|pia\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -717,19 +671,6 @@
         Token Time <$> intersect td1 td2
       _ -> Nothing
   }
-ruleIntersectBy2 :: Rule
-ruleIntersectBy2 = Rule
-  { name = "intersect by \",\" 2"
-  , pattern =
-    [ Predicate isNotLatent
-    , regex ","
-    , Predicate isNotLatent
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Time td1:_:Token Time td2:_) ->
-        Token Time <$> intersect td1 td2
-      _ -> Nothing
-  }
 
 ruleNthTimeAfterTime :: Rule
 ruleNthTimeAfterTime = Rule
@@ -790,9 +731,9 @@
 ruleFromTimeofdayTimeofdayInterval = Rule
   { name = "from <time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ regex "(ni\x017c|niz|od)"
+    [ regex "(niż|niz|od)"
     , Predicate isATimeOfDay
-    , regex "((but )?before)|\\-|do|po|a\x017c do|az do|a\x017c po|az po"
+    , regex "((but )?before)|\\-|do|po|aż do|az do|aż po|az po"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -801,20 +742,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "luty|lutego|lutemu|lut?\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleExactlyTimeofday :: Rule
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
   , pattern =
-    [ regex "(r(o|\x00f3)wno|dok(l|\x0142)adnie)( o)?"
+    [ regex "(r(o|ó)wno|dok(l|ł)adnie)( o)?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -826,7 +758,7 @@
 ruleSeason3 = Rule
   { name = "season"
   , pattern =
-    [ regex "zima|zimy|zimie|zim\x0119|zime|zim\x0105|zima|zimie|zimo"
+    [ regex "zima|zimy|zimie|zimę|zime|zimą|zima|zimie|zimo"
     ]
   , prod = \_ ->
       let from = monthDay 12 21
@@ -863,7 +795,7 @@
 ruleBetweenDatetimeAndDatetimeInterval = Rule
   { name = "between <datetime> and <datetime> (interval)"
   , pattern =
-    [ regex "(po|po )?mi(e|\x0119)dzy"
+    [ regex "(po|po )?mi(e|ę)dzy"
     , dimension Time
     , regex "a|i"
     , dimension Time
@@ -900,7 +832,7 @@
 ruleByTheEndOfTime = Rule
   { name = "by the end of <time>"
   , pattern =
-    [ regex "do (ko[\x0144n]ca )?(tego)?"
+    [ regex "do (ko[ńn]ca )?(tego)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -922,7 +854,7 @@
 ruleLastNCycle = Rule
   { name = "last n <cycle>"
   , pattern =
-    [ regex "ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej|e)?|(po ?)?przedni(ego|ch|emu|mi|m|e|(a|\x0105)|ej)?"
+    [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej|e)?|(po ?)?przedni(ego|ch|emu|mi|m|e|(a|ą)|ej)?"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -938,7 +870,7 @@
   { name = "<time-of-day> sharp"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "r(o|\x00f3)wno|dok(l|\x0142)adnie"
+    , regex "r(o|ó)wno|dok(l|ł)adnie"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -949,7 +881,7 @@
 ruleWithinDuration = Rule
   { name = "within <duration>"
   , pattern =
-    [ regex "(w )?ci(a|\x0105)gu|zakresie|obr\x0119bie|obrebie"
+    [ regex "(w )?ci(a|ą)gu|zakresie|obrębie|obrebie"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -992,8 +924,7 @@
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td1:Token Time td2:_) ->
-        Token Time <$> intersect td1 td2
+      (Token Time td1:Token Time td2:_) -> Token Time <$> intersect td1 td2
       _ -> Nothing
   }
 
@@ -1001,7 +932,7 @@
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "o?ko(l|\x0142)o|mniej wi(e|\x0119)cej|tak o"
+    [ regex "o?ko(l|ł)o|mniej wi(e|ę)cej|tak o"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1013,12 +944,12 @@
 ruleUntilTimeofday = Rule
   { name = "until <time-of-day>"
   , pattern =
-    [ regex "(a[\x017cz] )?do|przed"
-    , dimension Time
+    [ regex "(a(ż|z) )?do|przed"
+    , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) ->
-        tt $ withDirection TTime.Before td
+        tt . notLatent $ withDirection TTime.Before td
       _ -> Nothing
   }
 
@@ -1030,20 +961,10 @@
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        tt $ notLatent td
+      (_:Token Time td:_) -> tt $ notLatent td
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "czerwiec|czerwca|czerwcowi|czerwcem|czerwcu|czer?\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -1059,15 +980,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "sierpie\x0144|sierpien|sierpnia|sierpniowi|sierpniem|sierpniu|sierp\\.?|sier\\.?|sie\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -1087,17 +999,14 @@
   , pattern =
     [ regex "((wek|week|wik)(\\s|-)?end|wkend)"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleEomendOfMonth :: Rule
 ruleEomendOfMonth = Rule
   { name = "EOM|End of month"
   , pattern =
-    [ regex "(na |w )?(koniec|ko(n|\x0144)ca|ko(n|\x0144)cu|ko(n|\x0144)cowi|ko(n|\x0144)cem|ko(n|\x0144)c(o|\x00f3)wke) (miesi(a|\x0105)ca|msc)"
+    [ regex "(na |w )?(koniec|ko(n|ń)ca|ko(n|ń)cu|ko(n|ń)cowi|ko(n|ń)cem|ko(n|ń)c(o|ó)wke) (miesi(a|ą)ca|msc)"
     ]
   , prod = \_ -> tt $ cycleNth TG.Month 1
   }
@@ -1106,7 +1015,7 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "kolejn(ym|y|ego|emu|(a|\x0105)|ej|e)|nast(e|\x0119)pn(ym|y|ego|emu|e|(a|\x0105)|ej|e)|przysz(l|\x0142)(ego|emu|ym|(a|\x0105)|ej|ych|i|ymi|y|e)"
+    [ regex "kolejn(ym|y|ego|emu|(a|ą)|ej|e)|nast(e|ę)pn(ym|y|ego|emu|e|(a|ą)|ej|e)|przysz(l|ł)(ego|emu|ym|(a|ą)|ej|ych|i|ymi|y|e)"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -1187,7 +1096,7 @@
 ruleNextNCycle = Rule
   { name = "next n <cycle>"
   , pattern =
-    [ regex "kolejn(ym|y|ego|emu|(a|\x0105)|ej|e)|nast(e|\x0119)pn(ym|y|ego|emu|(a|\x0105)|ej|e)"
+    [ regex "kolejn(ym|y|ego|emu|(a|ą)|ej|e)|nast(e|ę)pn(ym|y|ego|emu|(a|ą)|ej|e)"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -1202,7 +1111,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "rano|poran(ek|ku|ka)|z rana|(s|\x015b)witem"
+    [ regex "rano|poran(ek|ku|ka)|z rana|(s|ś)witem"
     ]
   , prod = \_ ->
       let from = hour False 4
@@ -1228,7 +1137,7 @@
 ruleThisCycle = Rule
   { name = "this <cycle>"
   , pattern =
-    [ regex "te(mu|n|go|j)|tym|t(a|\x0105)|nadchodz(a|\x0105)c(ym|y|ego|emu|(a|\x0105)|ej)|obecn(ym|y|emu|ego|nym|(a|\x0105)|ej)"
+    [ regex "te(mu|n|go|j)|tym|t(a|ą)|nadchodz(a|ą)c(ym|y|ego|emu|(a|ą)|ej)|obecn(ym|y|emu|ego|nym|(a|ą)|ej)"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -1241,7 +1150,7 @@
 ruleThisTime = Rule
   { name = "this <time>"
   , pattern =
-    [ regex "te(mu|n|go|j)|ta|to|tym|nadchodz(a|\x0105)c(ym|y|ego|emu|(a|\x0105)|ej)"
+    [ regex "te(mu|n|go|j)|ta|to|tym|nadchodz(a|ą)c(ym|y|ego|emu|(a|ą)|ej)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1255,7 +1164,7 @@
   { name = "<duration> hence"
   , pattern =
     [ dimension Duration
-    , regex "p(o|\x00f3)(z|\x017a)niej|potem"
+    , regex "p(o|ó)(z|ź)niej|potem"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -1295,7 +1204,7 @@
   { name = "<time-of-day> popołudniu/wieczorem/w nocy"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(w )?noc(y|(a|\x0105))|(po ?)?po(l|\x0142)udni(em|e|a|u)|wiecz(o|\x00f3)r(i|u|a|owi|em|rze)"
+    , regex "(w )?noc(y|(a|ą))|(po ?)?po(l|ł)udni(em|e|a|u)|wiecz(o|ó)r(i|u|a|owi|em|rze)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ timeOfDayAMPM td False
@@ -1340,7 +1249,7 @@
 ruleSeason2 = Rule
   { name = "season"
   , pattern =
-    [ regex "jesie\x0144|jesien|jesieni|jesieni\x0105|jesienia"
+    [ regex "jesień|jesien|jesieni|jesienią|jesienia"
     ]
   , prod = \_ ->
       let from = monthDay 9 23
@@ -1365,7 +1274,7 @@
 ruleChristmas = Rule
   { name = "christmas"
   , pattern =
-    [ regex "((\x015a|\x015b|s)wi(e|\x0119)ta)? ?bo(z|\x017c)(ym|ego|e) narodzeni(e|a|u)"
+    [ regex "((Ś|ś|s)wi(e|ę)ta)? ?bo(z|ż)(ym|ego|e) narodzeni(e|a|u)"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -1412,24 +1321,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "maj|maja|majowi|majem|maju"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "niedziela|niedzieli|niedziel\x0119|niedziele|niedziela|niedziel\x0105|niedzieli|niedzielo|nied?z?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleHhmm :: Rule
 ruleHhmm = Rule
   { name = "hh:mm"
@@ -1451,7 +1342,7 @@
     [ regex "od"
     , Predicate isATimeOfDay
     , regex "-|to|th?ru|through|until"
-    , Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    , Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td1:_:Token Time td2:_) ->
@@ -1472,15 +1363,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "pa(z|\x017a)dziernik(a|owi|iem|u)?|pa\x017a\\.?|paz\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleHalloweenDay :: Rule
 ruleHalloweenDay = Rule
   { name = "halloween day"
@@ -1532,7 +1414,7 @@
 ruleLastDayofweekOfTime = Rule
   { name = "last <day-of-week> of <time>"
   , pattern =
-    [ regex "ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej)?"
+    [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej)?"
     , Predicate isADayOfWeek
     , regex "w(e)?|z(e)?"
     , dimension Time
@@ -1547,16 +1429,16 @@
 ruleFathersDay = Rule
   { name = "Father's Day"
   , pattern =
-    [ regex "dzie(n|\x0144) ?(taty|ojca)"
+    [ regex "dzie(n|ń) ?(taty|ojca)"
     ]
-  , prod = \_ -> tt $ nthDOWOfMonth 2 7 6
+  , prod = \_ -> tt $ nthDOWOfMonth 3 7 6
   }
 
 ruleLastCycleTime :: Rule
 ruleLastCycleTime = Rule
   { name = "last <cycle> <time>"
   , pattern =
-    [ regex "ostatni(ego|ch|emu|mi|m|(a|\x0105)|ej)?"
+    [ regex "ostatni(ego|ch|emu|mi|m|(a|ą)|ej)?"
     , dimension TimeGrain
     , dimension Time
     ]
@@ -1570,7 +1452,7 @@
 ruleByTime = Rule
   { name = "by <time>"
   , pattern =
-    [ regex "(a(z|\x017c) )?do"
+    [ regex "(a(z|ż) )?do"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1615,8 +1497,8 @@
 ruleTimeofdayTimeofdayInterval = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
-    , regex "\\-|:|do|po|a\x017c do|az do|a\x017c po|az po"
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
+    , regex "\\-|:|do|po|aż do|az do|aż po|az po"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1625,15 +1507,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "listopad|listopada|listopadowi|listopadem|listopadzie|lis\\.?|list\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleDurationAfterTime :: Rule
 ruleDurationAfterTime = Rule
   { name = "<duration> after <time>"
@@ -1652,7 +1525,7 @@
 ruleEveningnight = Rule
   { name = "evening|night"
   , pattern =
-    [ regex "wiecz(o|\x00f3)r(em|owi|ze|a|u)?|noc(\x0105)?"
+    [ regex "wiecz(o|ó)r(em|owi|ze|a|u)?|noc(ą)?"
     ]
   , prod = \_ ->
       let from = hour False 18
@@ -1676,15 +1549,6 @@
       _ -> Nothing
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "(\x015a|\x015b|s)rod(a|\x0105|y|e|\x0119|zie|owy|o)|(s|\x015b|\x015a)ro?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleDurationBeforeTime :: Rule
 ruleDurationBeforeTime = Rule
   { name = "<duration> before <time>"
@@ -1718,7 +1582,7 @@
 ruleEoyendOfYear = Rule
   { name = "EOY|End of year"
   , pattern =
-    [ regex "(na |w )?(koniec|ko(n|\x0144)ca|ko(n|\x0144)cu|ko(n|\x0144)cowi|ko(n|\x0144)cem|ko(n|\x0144)c(o|\x00f3)wke) (rok(u|owi|iem))"
+    [ regex "(na |w )?(koniec|ko(n|ń)ca|ko(n|ń)cu|ko(n|ń)cowi|ko(n|ń)cem|ko(n|ń)c(o|ó)wke) (rok(u|owi|iem))"
     ]
   , prod = \_ -> tt $ cycleNth TG.Year 1
   }
@@ -1736,9 +1600,9 @@
 ruleMothersDay = Rule
   { name = "Mother's Day"
   , pattern =
-    [ regex "dzie(n|\x0144) ? ma(my|tki|m)"
+    [ regex "dzie(n|ń) ?ma(my|tki|m)"
     ]
-  , prod = \_ -> tt $ nthDOWOfMonth 1 7 5
+  , prod = \_ -> tt $ nthDOWOfMonth 2 7 5
   }
 
 ruleTimeofdayOclock :: Rule
@@ -1754,15 +1618,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "wrzesie\x0144|wrzesien|wrze\x015bnia|wrzesnia|wrze\x015bniowi|wrzesniowi|wrzesie\x0144|wrzesien|wrze\x015bniem|wrzesniem|wrze\x015bniu|wrzesniu|wrz\\.?|wrze\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -1801,7 +1656,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1863,7 +1718,6 @@
   , ruleIntegerLatentTimeofday
   , ruleIntersect
   , ruleIntersectBy
-  , ruleIntersectBy2
   , ruleIntersectByOfFromS
   , ruleLastCycle
   , ruleLastCycleOfTime
@@ -1878,25 +1732,6 @@
   , ruleMonthDdddInterval
   , ruleMorning
   , ruleMothersDay
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
   , ruleNewYearsEve
@@ -1957,3 +1792,5 @@
   , ruleYyyymmdd
   , ruleTimezone
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -13,24 +13,28 @@
   , negativeCorpus
   ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 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)
-import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {lang = PT}, examples)
+negativeCorpus = (testContext {locale = makeLocale PT Nothing}, examples)
   where
     examples =
       [ "no 987"
+      , "um"
+      , "um dos"
+      , "um dos minutos"
+      , "ter"
       ]
 
 allExamples :: [Example]
@@ -83,7 +87,6 @@
              , "terca feira"
              , "terca"
              , "ter."
-             , "ter"
              ]
   , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
              [ "quarta-feira"
@@ -150,6 +153,7 @@
              [ "1 de março"
              , "primeiro de março"
              , "um de março"
+             , "1o de março"
              ]
   , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
              [ "1-3-2013"
diff --git a/Duckling/Time/PT/Rules.hs b/Duckling/Time/PT/Rules.hs
--- a/Duckling/Time/PT/Rules.hs
+++ b/Duckling/Time/PT/Rules.hs
@@ -13,17 +13,17 @@
 module Duckling.Time.PT.Rules
   ( rules ) where
 
-import qualified Data.Text as Text
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Regex.Types
 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
-import Duckling.Types
 
 ruleNamedday :: Rule
 ruleNamedday = Rule
@@ -38,7 +38,7 @@
 ruleSHourmintimeofday = Rule
   { name = "às <hour-min>(time-of-day)"
   , pattern =
-    [ regex "(\x00e0|a)s?"
+    [ regex "(à|a)s?"
     , Predicate isATimeOfDay
     , regex "horas?"
     ]
@@ -51,7 +51,7 @@
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow"
   , pattern =
-    [ regex "depois de amanh(\x00e3|a)"
+    [ regex "depois de amanh(ã|a)"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
@@ -69,7 +69,7 @@
 ruleNamedday2 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "ter(\x00e7|c)a((\\s|\\-)feira)?|ter\\.?"
+    [ regex "ter(ç|c)a((\\s|\\-)feira)?|ter\\."
     ]
   , prod = \_ -> tt $ dayOfWeek 2
   }
@@ -99,13 +99,12 @@
 ruleIntersectByDaOrDe = Rule
   { name = "intersect by `da` or `de`"
   , pattern =
-    [ Predicate isNotLatent
+    [ dimension Time
     , regex "d[ae]"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td1:_:Token Time td2:_) ->
-        Token Time <$> intersect td1 td2
+      (Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td1 td2
       _ -> Nothing
   }
 
@@ -128,12 +127,11 @@
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
-    [ regex "(\x00fa|u)ltim[ao]s?"
+    [ regex "(ú|u)ltim[ao]s?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        tt $ predNth (-1) False td
+      (_:Token Time td:_) -> tt $ predNth (-1) False td
       _ -> Nothing
   }
 
@@ -141,7 +139,7 @@
 ruleNamedday6 = Rule
   { name = "named-day"
   , pattern =
-    [ regex "s(\x00e1|a)bado|s(\x00e1|a)b\\.?"
+    [ regex "s(á|a)bado|s(á|a)b\\.?"
     ]
   , prod = \_ -> tt $ dayOfWeek 6
   }
@@ -188,7 +186,7 @@
   , pattern =
     [ regex "primeiro|um|1o"
     ]
-  , prod = \_ -> tt $ dayOfMonth 1
+  , prod = \_ -> tt . mkLatent $ dayOfMonth 1
   }
 
 ruleNow :: Rule
@@ -242,7 +240,7 @@
 ruleProximoCycle = Rule
   { name = "proximo <cycle> "
   , pattern =
-    [ regex "pr(\x00f3|o)xim(o|a)s?"
+    [ regex "pr(ó|o)xim(o|a)s?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -282,7 +280,7 @@
 ruleSHourminTimeofday = Rule
   { name = "às <hour-min> <time-of-day>"
   , pattern =
-    [ regex "(\x00e0|a)s"
+    [ regex "(à|a)s"
     , Predicate isNotLatent
     , regex "da"
     , Predicate isATimeOfDay
@@ -345,7 +343,7 @@
 ruleProximasNCycle = Rule
   { name = "proximas n <cycle>"
   , pattern =
-    [ regex "pr(\x00f3|o)xim(o|a)s?"
+    [ regex "pr(ó|o)xim(o|a)s?"
     , Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
     ]
@@ -360,7 +358,7 @@
 ruleThisnextDayofweek = Rule
   { name = "this|next <day-of-week>"
   , pattern =
-    [ regex "es[ts][ae]|pr(\x00f3|o)xim[ao]"
+    [ regex "es[ts][ae]|pr(ó|o)xim[ao]"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -382,7 +380,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -415,7 +413,7 @@
   { name = "<integer> para as <hour-of-day> (as relative minutes)"
   , pattern =
     [ Predicate $ isIntegerBetween 1 59
-    , regex "para ((o|a|\x00e0)s?)?"
+    , regex "para ((o|a|à)s?)?"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -430,7 +428,7 @@
 ruleHourofdayIntegerAsRelativeMinutes2 = Rule
   { name = "<hour-of-day> <integer> (as relative minutes) minutos"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     , regex "min\\.?(uto)?s?"
     ]
@@ -466,7 +464,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 59
     , regex "min\\.?(uto)?s?"
-    , regex "para ((o|a|\x00e0)s?)?"
+    , regex "para ((o|a|à)s?)?"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -505,7 +503,7 @@
 ruleQuarterParaAsHourofdayAsRelativeMinutes = Rule
   { name = "quinze para as <hour-of-day> (as relative minutes)"
   , pattern =
-    [ regex "quinze para ((o|a|\x00e0)s?)?"
+    [ regex "quinze para ((o|a|à)s?)?"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -541,7 +539,7 @@
 ruleHalfParaAsHourofdayAsRelativeMinutes = Rule
   { name = "half para as <hour-of-day> (as relative minutes)"
   , pattern =
-    [ regex "(meia|trinta) para ((o|a|\x00e0)s?)?"
+    [ regex "(meia|trinta) para ((o|a|à)s?)?"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -577,7 +575,7 @@
 ruleThreeQuarterParaAsHourofdayAsRelativeMinutes = Rule
   { name = "3/4 para as <hour-of-day> (as relative minutes)"
   , pattern =
-    [ regex "quarenta e cinco para ((o|a|\x00e0)s?)?"
+    [ regex "quarenta e cinco para ((o|a|à)s?)?"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -633,7 +631,7 @@
 ruleNamedmonth3 = Rule
   { name = "named-month"
   , pattern =
-    [ regex "mar(\x00e7|c)o|mar\\.?"
+    [ regex "mar(ç|c)o|mar\\.?"
     ]
   , prod = \_ -> tt $ month 3
   }
@@ -642,7 +640,7 @@
 ruleDepoisDasTimeofday = Rule
   { name = "depois das <time-of-day>"
   , pattern =
-    [ regex "(depois|ap(\x00f3|o)s) d?((a|\x00e1|\x00e0)[so]?|os?)"
+    [ regex "(depois|ap(ó|o)s) d?((a|á|à)[so]?|os?)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -705,7 +703,7 @@
   { name = "<dim time> da manha"
   , pattern =
     [ Predicate $ isGrainFinerThan TG.Year
-    , regex "(da|na|pela) manh(\x00e3|a)"
+    , regex "(da|na|pela) manh(ã|a)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> do
@@ -721,7 +719,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
-    , regex "(pr(\x00f3|o)xim(o|a)s?|que vem?|seguintes?)"
+    , regex "(pr(ó|o)xim(o|a)s?|que vem?|seguintes?)"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -790,7 +788,7 @@
 ruleUltimoTime = Rule
   { name = "ultimo <time>"
   , pattern =
-    [ regex "(u|\x00fa)ltimo"
+    [ regex "(u|ú)ltimo"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -837,7 +835,7 @@
 ruleSeason = Rule
   { name = "season"
   , pattern =
-    [ regex "ver(\x00e3|a)o"
+    [ regex "ver(ã|a)o"
     ]
   , prod = \_ ->
       let from = monthDay 6 21
@@ -849,7 +847,7 @@
 ruleRightNow = Rule
   { name = "right now"
   , pattern =
-    [ regex "agora|j(\x00e1|a)|(nesse|neste) instante"
+    [ regex "agora|j(á|a)|(nesse|neste) instante"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -900,7 +898,7 @@
   { name = "<named-month|named-day> next"
   , pattern =
     [ dimension Time
-    , regex "(da pr(o|\x00f3)xima semana)|(da semana)? que vem"
+    , regex "(da pr(o|ó)xima semana)|(da semana)? que vem"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -978,7 +976,7 @@
 ruleSTimeofday = Rule
   { name = "às <time-of-day>"
   , pattern =
-    [ regex "(\x00e0|a)s?"
+    [ regex "(à|a)s?"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -1017,10 +1015,7 @@
   , pattern =
     [ regex "final de semana|fim de semana|fds"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleDayofweekSHourmin :: Rule
@@ -1028,7 +1023,7 @@
   { name = "<day-of-week> às <hour-min>"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(\x00e0|a)s"
+    , regex "(à|a)s"
     , Predicate isNotLatent
     , regex "da|pela"
     , Predicate isATimeOfDay
@@ -1065,7 +1060,7 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "(d[ao]) pr(\x00f3|o)xim[ao]s?|que vem"
+    [ regex "(d[ao]) pr(ó|o)xim[ao]s?|que vem"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -1092,7 +1087,7 @@
 ruleVesperaDeAnoNovo = Rule
   { name = "vespera de ano novo"
   , pattern =
-    [ regex "v(\x00e9|e)spera d[eo] ano[\\s\\-]novo"
+    [ regex "v(é|e)spera d[eo] ano[\\s\\-]novo"
     ]
   , prod = \_ -> tt $ monthDay 12 31
   }
@@ -1186,7 +1181,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "manh(\x00e3|a)"
+    [ regex "manh(ã|a)"
     ]
   , prod = \_ ->
       let from = hour False 4
@@ -1225,7 +1220,7 @@
 ruleProclamaoDaRepblica = Rule
   { name = "Proclamação da República"
   , pattern =
-    [ regex "proclama(c|\x00e7)(a|\x00e3)o da rep(\x00fa|u)blica"
+    [ regex "proclama(c|ç)(a|ã)o da rep(ú|u)blica"
     ]
   , prod = \_ -> tt $ monthDay 11 15
   }
@@ -1279,7 +1274,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
     , dimension TimeGrain
-    , regex "atr(a|\x00e1)s"
+    , regex "atr(a|á)s"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -1431,7 +1426,7 @@
 ruleAntesDasTimeofday = Rule
   { name = "antes das <time-of-day>"
   , pattern =
-    [ regex "(antes|at(e|\x00e9)|n(a|\x00e3)o mais que) (d?(o|a|\x00e0)s?)?"
+    [ regex "(antes|at(e|é)|n(a|ã)o mais que) (d?(o|a|à)s?)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1445,7 +1440,7 @@
   { name = "n proximas <cycle>"
   , pattern =
     [ Predicate $ isIntegerBetween 2 9999
-    , regex "pr(\x00f3|o)xim(o|a)s?"
+    , regex "pr(ó|o)xim(o|a)s?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -1483,7 +1478,7 @@
 ruleIndependecia = Rule
   { name = "Independecia"
   , pattern =
-    [ regex "independ(\x00ea|e)ncia"
+    [ regex "independ(ê|e)ncia"
     ]
   , prod = \_ -> tt $ monthDay 9 7
   }
@@ -1501,7 +1496,7 @@
 ruleTomorrow = Rule
   { name = "tomorrow"
   , pattern =
-    [ regex "amanh(\x00e3|a)"
+    [ regex "amanh(ã|a)"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
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
@@ -9,19 +9,28 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.RO.Corpus
-  ( corpus ) where
+  ( corpus
+  , negativeCorpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.TimeGrain.Types hiding (add)
 import Duckling.Testing.Types hiding (examples)
 
+negativeCorpus :: NegativeCorpus
+negativeCorpus = (testContext, examples)
+  where
+    examples =
+      [ "sa"
+      ]
+
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -69,7 +78,6 @@
              [ "sambata"
              , "sâmbătă"
              , "sam"
-             , "sa"
              ]
   , examples (datetime (2013, 2, 17, 0, 0, 0) Day)
              [ "duminica"
diff --git a/Duckling/Time/RO/Rules.hs b/Duckling/Time/RO/Rules.hs
--- a/Duckling/Time/RO/Rules.hs
+++ b/Duckling/Time/RO/Rules.hs
@@ -13,7 +13,7 @@
 module Duckling.Time.RO.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
+import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
@@ -21,9 +21,9 @@
 import Duckling.Regex.Types
 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
-import Duckling.Types
 
 ruleAcum :: Rule
 ruleAcum = Rule
@@ -34,48 +34,21 @@
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "lu(n(ea|i)?)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
-
 ruleDupamiaza :: Rule
 ruleDupamiaza = Rule
   { name = "dupamiaza"
   , pattern =
-    [ regex "dupamiaz(a|\x0103)|dup(a|\x0103) amiaz(a|\x0103)"
+    [ regex "dupamiaz(a|ă)|dup(a|ă) amiaz(a|ă)"
     ]
   , prod = \_ -> Token Time . mkLatent . partOfDay <$>
       interval TTime.Open (hour False 12) (hour False 19)
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "dec(embrie)?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "ma(r((t|\x021b)(ea|i))?)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleValentinesDay :: Rule
 ruleValentinesDay = Rule
   { name = "valentine's day"
   , pattern =
-    [ regex "sf\\.?((a|\x00e2)ntul)? Valentin"
+    [ regex "sf\\.?((a|â)ntul)? Valentin"
     ]
   , prod = \_ -> tt $ monthDay 2 14
   }
@@ -101,24 +74,6 @@
   , prod = \_ -> tt $ monthDay 1 1
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "s(a|\x00e2)mb(a|\x0103)t(a|\x0103)|s(a|\x00e2)m|s(a|\x00e2)"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "iul(ie)?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleOrdinalTrimestruYear :: Rule
 ruleOrdinalTrimestruYear = Rule
   { name = "<ordinal> trimestru <year>"
@@ -138,7 +93,7 @@
 ruleInNamedmonth = Rule
   { name = "in <named-month>"
   , pattern =
-    [ regex "(i|\x00ee)n"
+    [ regex "(i|î)n"
     , Predicate isAMonth
     ]
   , prod = \tokens -> case tokens of
@@ -165,7 +120,7 @@
 ruleIntroNamedday = Rule
   { name = "intr-o <named-day>"
   , pattern =
-    [ regex "((i|\x00ee)n(tr)?(\\-?o)?)"
+    [ regex "((i|î)n(tr)?(\\-?o)?)"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -196,20 +151,11 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "jo(ia?)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleInDuration :: Rule
 ruleInDuration = Rule
   { name = "in <duration>"
   , pattern =
-    [ regex "(i|\x00ee)n"
+    [ regex "(i|î)n"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -230,7 +176,7 @@
 ruleCycleAcesta = Rule
   { name = "<cycle> acesta"
   , pattern =
-    [ regex "aceasta|acest|(a|\x0103)sta"
+    [ regex "aceasta|acest|(a|ă)sta"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -255,7 +201,7 @@
 ruleAzi = Rule
   { name = "azi"
   , pattern =
-    [ regex "a(st(a|\x0103))?zi"
+    [ regex "a(st(a|ă))?zi"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 0
   }
@@ -274,7 +220,7 @@
   { name = "<time> trecut[aă]?"
   , pattern =
     [ dimension Time
-    , regex "(trecut(a|\x0103)?)"
+    , regex "(trecut(a|ă)?)"
     ]
   , prod = \tokens -> case tokens of
       (_:Token Time td:_) -> tt $ predNth (-1) False td
@@ -286,7 +232,7 @@
   { name = "this|next <day-of-week>"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "aceasta|(a|\x0103)sta|urm(a|\x0103)toare"
+    , regex "aceasta|(a|ă)sta|urm(a|ă)toare"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ predNth 0 True td
@@ -297,9 +243,9 @@
 ruleBetweenTimeofdayAndTimeofdayInterval = Rule
   { name = "between <time-of-day> and <time-of-day> (interval)"
   , pattern =
-    [ regex "(i|\x00ee)ntre"
+    [ regex "(i|î)ntre"
     , Predicate isATimeOfDay
-    , regex "(s|\x0219)i"
+    , regex "(s|ș)i"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -308,20 +254,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "ian(uarie)?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleUrmatoareaCycle :: Rule
 ruleUrmatoareaCycle = Rule
   { name = "urmatoarea <cycle>"
   , pattern =
-    [ regex "(urm(a|\x0103)to(area|rul)|viito(are|r))"
+    [ regex "(urm(a|ă)to(area|rul)|viito(are|r))"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -334,27 +271,18 @@
   { name = "<cycle> acesta"
   , pattern =
     [ dimension TimeGrain
-    , regex "aceasta|acest|(a|\x0103)sta|curent(a|\x0103)"
+    , regex "aceasta|acest|(a|ă)sta|curent(a|ă)"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) -> tt $ cycleNth grain 0
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "martie|mar"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleCraciun :: Rule
 ruleCraciun = Rule
   { name = "craciun"
   , pattern =
-    [ regex "(ziua de )?cr(a|\x0103)ciun"
+    [ regex "(ziua de )?cr(a|ă)ciun"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -400,15 +328,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "apr(ilie)?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleBlackFriday :: Rule
 ruleBlackFriday = Rule
   { name = "black friday"
@@ -422,7 +341,7 @@
 ruleChristmasEve = Rule
   { name = "christmas eve"
   , pattern =
-    [ regex "ajun(ul)? (de )?cr(a|\x0103)ciun"
+    [ regex "ajun(ul)? (de )?cr(a|ă)ciun"
     ]
   , prod = \_ -> tt $ monthDay 12 24
   }
@@ -443,7 +362,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -460,7 +379,7 @@
   { name = "<hour-of-day> sfert"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "((s|\x0219)i )?(un )?sfert"
+    , regex "((s|ș)i )?(un )?sfert"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
@@ -473,7 +392,7 @@
   { name = "<hour-of-day> sfert"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "((s|\x0219)i )?jum(a|\x0103)tate|jumate"
+    , regex "((s|ș)i )?jum(a|ă)tate|jumate"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
@@ -481,20 +400,11 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "vi(n(er(ea|i))?)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDiseara :: Rule
 ruleDiseara = Rule
   { name = "diseara"
   , pattern =
-    [ regex "disear(a|\x0103)|((i|\x00ee)n aceas(a|\x0103) )?sear(a|\x0103)"
+    [ regex "disear(a|ă)|((i|î)n aceas(a|ă) )?sear(a|ă)"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day 0
@@ -535,7 +445,7 @@
   , pattern =
     [ dimension Ordinal
     , dimension Time
-    , regex "dup(a|\x0103)"
+    , regex "dup(a|ă)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -576,9 +486,9 @@
 ruleFromTimeofdayTimeofdayInterval = Rule
   { name = "from <time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ regex "(dup(a|\x0103)|(i|\x00ee)ncep(a|\x00e2)nd cu)"
+    [ regex "(dup(a|ă)|(i|î)ncep(a|â)nd cu)"
     , Predicate isATimeOfDay
-    , regex "(dar |(s|\x0219)i )?((i|\x00ee)nainte|p(a|\x00e2)n(a|\x0103) la( de)?)"
+    , regex "(dar |(s|ș)i )?((i|î)nainte|p(a|â)n(a|ă) la( de)?)"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -587,20 +497,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "feb(ruarie)?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleSeason3 :: Rule
 ruleSeason3 = Rule
   { name = "season"
   , pattern =
-    [ regex "primavar(a|\x0103)"
+    [ regex "primavar(a|ă)"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (monthDay 3 20) (monthDay 6 21)
@@ -610,7 +511,7 @@
 ruleUrmatoareleNCycle = Rule
   { name = "urmatoarele n <cycle>"
   , pattern =
-    [ regex "urm(a|\x0103)to(arele|rii|area)"
+    [ regex "urm(a|ă)to(arele|rii|area)"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -625,7 +526,7 @@
 ruleSeason = Rule
   { name = "season"
   , pattern =
-    [ regex "toamn(a|\x0103)"
+    [ regex "toamn(a|ă)"
     ]
   , prod = \_ -> Token Time <$>
       interval TTime.Open (monthDay 9 23) (monthDay 12 21)
@@ -635,7 +536,7 @@
 ruleDupaDuration = Rule
   { name = "dupa <duration>"
   , pattern =
-    [ regex "dup(a|\x0103)"
+    [ regex "dup(a|ă)"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -657,7 +558,7 @@
 ruleByTheEndOfTime = Rule
   { name = "by the end of <time>"
   , pattern =
-    [ regex "p(a|\x00ee)n(a|\x0103) ((i|\x00ee)n|la)"
+    [ regex "p(a|î)n(a|ă) ((i|î)n|la)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -708,7 +609,7 @@
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "(cam|aproximativ|(i|\x00ee)n jur de)"
+    [ regex "(cam|aproximativ|(i|î)n jur de)"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -720,7 +621,7 @@
 ruleUntilTimeofday = Rule
   { name = "until <time-of-day>"
   , pattern =
-    [ regex "p(a|\x00ee)n(a|\x0103) ((i|\x00ee)n|la)"
+    [ regex "p(a|î)n(a|ă) ((i|î)n|la)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -741,22 +642,13 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "iun(ie)?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleIntreDatetimeSiDatetimeInterval :: Rule
 ruleIntreDatetimeSiDatetimeInterval = Rule
   { name = "intre <datetime> si <datetime> (interval)"
   , pattern =
-    [ regex "(i|\x00ee)nre"
+    [ regex "(i|î)nre"
     , dimension Time
-    , regex "(s|\x0219)i"
+    , regex "(s|ș)i"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -781,15 +673,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "aug(ust)?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -809,10 +692,7 @@
   , pattern =
     [ regex "(week(\\s|\\-)?end|wkend)"
     ]
-  , prod = \_ -> do
-      fri <- intersect (dayOfWeek 5) (hour False 18)
-      mon <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open fri mon
+  , prod = \_ -> tt weekend
   }
 
 rulePeDayofmonthNonOrdinal :: Rule
@@ -834,7 +714,7 @@
   { name = "<time> (aceasta|acesta|[aă]sta)"
   , pattern =
     [ dimension Time
-    , regex "aceasta|(a|\x0103)sta|urm(a|\x0103)toare"
+    , regex "aceasta|(a|ă)sta|urm(a|ă)toare"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -846,7 +726,7 @@
 ruleEomendOfMonth = Rule
   { name = "EOM|End of month"
   , pattern =
-    [ regex "sf(a|\x00e2)r(s|\x0219)itul lunii"
+    [ regex "sf(a|â)r(s|ș)itul lunii"
     ]
   , prod = \_ -> tt $ cycleNth TG.Month 1
   }
@@ -881,7 +761,7 @@
   { name = "<cycle> urmatoare"
   , pattern =
     [ dimension TimeGrain
-    , regex "(urm(a|\x0103)to(are|r)|viito(are|r))"
+    , regex "(urm(a|ă)to(are|r)|viito(are|r))"
     ]
   , prod = \tokens -> case tokens of
       (_:Token TimeGrain grain:_) -> tt $ cycleNth grain 1
@@ -922,7 +802,7 @@
   { name = "<cycle> trecut"
   , pattern =
     [ dimension TimeGrain
-    , regex "trecut(a|\x0103)?"
+    , regex "trecut(a|ă)?"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) ->
@@ -948,7 +828,7 @@
   { name = "<duration> inainte de <time>"
   , pattern =
     [ dimension Duration
-    , regex "(i|\x00ee)nainte de"
+    , regex "(i|î)nainte de"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -975,7 +855,7 @@
   { name = "<duration> in urma"
   , pattern =
     [ dimension Duration
-    , regex "(i|\x00ee)n urm(a|\x0103)"
+    , regex "(i|î)n urm(a|ă)"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) -> tt $ durationAgo dd
@@ -998,7 +878,7 @@
 ruleSezonAnotimp = Rule
   { name = "sezon anotimp"
   , pattern =
-    [ regex "var(a|\x0103)"
+    [ regex "var(a|ă)"
     ]
   , prod = \_ ->
       Token Time <$> interval TTime.Open (monthDay 6 21) (monthDay 9 23)
@@ -1008,7 +888,7 @@
 ruleSearaNoapte = Rule
   { name = "sear[aă] noapte"
   , pattern =
-    [ regex "sear(a|\x0103)|noapte"
+    [ regex "sear(a|ă)|noapte"
     ]
   , prod = \_ -> Token Time . mkLatent . partOfDay <$>
       interval TTime.Open (hour False 18) (hour False 0)
@@ -1031,7 +911,7 @@
 ruleSeason2 = Rule
   { name = "season"
   , pattern =
-    [ regex "iarn(a|\x0103)"
+    [ regex "iarn(a|ă)"
     ]
   , prod = \_ ->
       Token Time <$> interval TTime.Open (monthDay 12 21) (monthDay 3 20)
@@ -1056,7 +936,7 @@
 ruleAfterTimeofday = Rule
   { name = "after <time-of-day>"
   , pattern =
-    [ regex "dup(a|\x0103)"
+    [ regex "dup(a|ă)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1068,7 +948,7 @@
 ruleDimineata = Rule
   { name = "diminea[tț][aă]"
   , pattern =
-    [ regex "diminea(t|\x021b)(a|\x0103)"
+    [ regex "diminea(t|ț)(a|ă)"
     ]
   , prod = \_ -> Token Time . mkLatent . partOfDay <$>
       interval TTime.Open (hour False 4) (hour False 12)
@@ -1078,7 +958,7 @@
 ruleTimeUrmatoarer = Rule
   { name = "<time> urm[aă]to(are|r)"
   , pattern =
-    [ regex "urm(a|\x0103)to(are|r)"
+    [ regex "urm(a|ă)to(are|r)"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -1086,15 +966,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mai"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
 ruleTimeofdayFix :: Rule
 ruleTimeofdayFix = Rule
   { name = "<time-of-day> fix"
@@ -1107,15 +978,6 @@
       _ -> Nothing
   }
 
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "du(m(inic(a|\x0103))?)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleHhmm :: Rule
 ruleHhmm = Rule
   { name = "hh:mm"
@@ -1134,7 +996,7 @@
 ruleMaine = Rule
   { name = "maine"
   , pattern =
-    [ regex "m(a|\x00e2)ine"
+    [ regex "m(a|â)ine"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -1143,7 +1005,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1166,15 +1028,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "oct(ombrie)?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleHalloweenDay :: Rule
 ruleHalloweenDay = Rule
   { name = "halloween day"
@@ -1273,7 +1126,7 @@
 ruleByTime = Rule
   { name = "by <time>"
   , pattern =
-    [ regex "p(a|\x00e2)n(a|\x0103) (la|(i|\x00ee)n)"
+    [ regex "p(a|â)n(a|ă) (la|(i|î)n)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1297,24 +1150,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "noi(embrie)?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "mi(e(rcur(ea|i))?)?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleMmddyyyy :: Rule
 ruleMmddyyyy = Rule
   { name = "mm/dd/yyyy"
@@ -1334,7 +1169,7 @@
 ruleEoyendOfYear = Rule
   { name = "EOY|End of year"
   , pattern =
-    [ regex "sf(a|\x00e2)r(s|\x0219)itul anului"
+    [ regex "sf(a|â)r(s|ș)itul anului"
     ]
   , prod = \_ -> tt $ cycleNth TG.Year 1
   }
@@ -1360,15 +1195,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "sept(embrie)?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleHhmmss :: Rule
 ruleHhmmss = Rule
   { name = "hh:mm:ss"
@@ -1384,6 +1210,51 @@
       _ -> Nothing
   }
 
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "luni"  , "lu(n(ea|i)?)?"                        )
+  , ( "marti"  , "ma(r((t|ț)(ea|i))?)?"                )
+  , ( "miercuri"  , "mi(e(rcur(ea|i))?)?"              )
+  , ( "joi"  , "jo(ia?)?"                              )
+  , ( "vineri"  , "vi(n(er(ea|i))?)?"                  )
+  , ( "sambata" , "s(a|â)mb(a|ă)t(a|ă)|s(a|â)m"        )
+  , ( "duminica"  , "du(m(inic(a|ă))?)?"               )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "ianuarie"  , "ian(uarie)?"     )
+  , ( "februarie"  , "feb(ruarie)?"   )
+  , ( "martie"  , "martie|mar"        )
+  , ( "aprilie"  , "apr(ilie)?"       )
+  , ( "mai"  , "mai"                  )
+  , ( "iunie"  , "iun(ie)?"           )
+  , ( "iulie"  , "iul(ie)?"           )
+  , ( "august"  , "aug(ust)?"         )
+  , ( "septembrie"  , "sept(embrie)?" )
+  , ( "octombrie"  , "oct(ombrie)?"   )
+  , ( "noiembrie"  , "noi(embrie)?"   )
+  , ( "decembrie"  , "dec(embrie)?"   )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 rules :: [Rule]
 rules =
   [ ruleAboutTimeofday
@@ -1440,27 +1311,8 @@
   , ruleMmddyyyy
   , ruleMonthDdddInterval
   , ruleMothersDay
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
   , ruleNameddayDayofmonthNumeral
   , ruleNameddayPeDayofmonthNumeral
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNewYearsDay
   , ruleNewYearsEve
@@ -1501,3 +1353,5 @@
   , ruleYearLatent2
   , ruleYyyymmdd
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -9,20 +9,21 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.SV.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 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)
-import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {lang = SV}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -75,18 +76,18 @@
   , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
              [ "Den förste mars"
              , "Den första mars"
-             , "1. mars"
-             , "Den 1. mars"
+             , "1:a mars"
+             , "Den 1:a mars"
              ]
   , examples (datetime (2013, 3, 3, 0, 0, 0) Day)
              [ "3 mars"
              , "den tredje mars"
-             , "den 3. mars"
+             , "den 3:e mars"
              ]
   , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
              [ "3 mars 2015"
              , "tredje mars 2015"
-             , "3. mars 2015"
+             , "3:e mars 2015"
              , "3-3-2015"
              , "03-03-2015"
              , "3/3/2015"
@@ -95,14 +96,13 @@
              , "2015-03-03"
              ]
   , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
-             [ "På den 15."
+             [ "På den 15:e"
              , "På den 15"
-             , "Den 15."
-             , "Den 15"
+             , "Den 15:e"
              ]
   , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
-             [ "den 15. februari"
-             , "15. februari"
+             [ "den 15:e februari"
+             , "15:e februari"
              , "februari 15"
              , "15-02"
              , "15/02"
@@ -167,24 +167,25 @@
              ]
   , examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
              [ "tredje kvartalet"
-             , "3. kvartal"
-             , "3 kvartal"
+             , "3:e kvartal"
              ]
   , examples (datetime (2018, 10, 1, 0, 0, 0) Quarter)
-             [ "4. kvartal 2018"
+             [ "4:e kvartal 2018"
              , "fjärde kvartalet 2018"
              ]
-  , examples (datetime (2012, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2012, 1, 1, 0, 0, 0) Year)
              [ "förra år"
+             , "förra året"
+             , "föregående år"
              ]
-  , examples (datetime (2012, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2012, 1, 1, 0, 0, 0) Year)
              [ "i fjol"
              ]
-  , examples (datetime (2013, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2013, 1, 1, 0, 0, 0) Year)
              [ "i år"
              , "detta år"
              ]
-  , examples (datetime (2014, 0, 0, 0, 0, 0) Year)
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
              [ "nästa år"
              ]
   , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
@@ -194,6 +195,7 @@
              ]
   , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
              [ "förra tisdag"
+             , "i tisdags"
              ]
   , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
              [ "nästa tisdag"
diff --git a/Duckling/Time/SV/Rules.hs b/Duckling/Time/SV/Rules.hs
--- a/Duckling/Time/SV/Rules.hs
+++ b/Duckling/Time/SV/Rules.hs
@@ -13,47 +13,74 @@
 module Duckling.Time.SV.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
+import Data.Text (Text)
 import Prelude
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Ordinal.Types (OrdinalData (..))
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "m\x00e5ndag(en)?|m\x00e5n\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Mandag"  , "måndag(en)?s?|mån\\.?"    )
+  , ( "Tisdag"  , "tisdag(en)?s?|tis?\\.?"   )
+  , ( "Onsdag"  , "onsdag(en)?s?|ons\\.?"    )
+  , ( "Torsdag" , "torsdag(en)?s?|tors?\\.?" )
+  , ( "Fredag"  , "fredag(en)?s?|fre\\.?"    )
+  , ( "Lordag"  , "lördag(en)?s?|lör\\.?"    )
+  , ( "Sondag"  , "söndag(en)?s?|sön\\.?"    )
+  ]
 
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ("Januari"   , "januari|jan\\.?"     )
+  , ("Februari"  , "februari|feb\\.?"    )
+  , ("Mars"      , "mars|mar\\.?"        )
+  , ("April"     , "april|apr\\.?"       )
+  , ("Maj"       , "maj"                 )
+  , ("Juni"      , "juni|jun\\.?"        )
+  , ("Juli"      , "juli|jul\\.?"        )
+  , ("Augusti"   , "augusti|aug\\.?"     )
+  , ("September" , "september|sept?\\.?" )
+  , ("Oktober"   , "oktober|okt\\.?"     )
+  , ("November"  , "november|nov\\.?"    )
+  , ("December"  , "december|dec\\.?"    )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleTheDayAfterTomorrow :: Rule
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow"
   , pattern =
-    [ regex "i \x00f6verimorgon"
+    [ regex "i överimorgon"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "december|dec\\.?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
@@ -75,7 +102,7 @@
   { name = "relative minutes after|past <integer> (hour-of-day)"
   , pattern =
     [ Predicate $ isIntegerBetween 1 59
-    , regex "\x00f6ver"
+    , regex "över"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -92,7 +119,7 @@
 ruleHourofdayIntegerAsRelativeMinutes = Rule
   { name = "<hour-of-day> <integer> (as relative minutes)"
   , pattern =
-    [ Predicate isAnHourOfDay
+    [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay]
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -122,7 +149,7 @@
   { name = "quarter after|past <integer> (hour-of-day)"
   , pattern =
     [ regex "(en)? ?(kvart)(er)?"
-    , regex "\x00f6ver"
+    , regex "över"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -164,7 +191,7 @@
   { name = "half after|past <integer> (hour-of-day)"
   , pattern =
     [ regex "halvtimme"
-    , regex "\x00f6ver"
+    , regex "över"
     , Predicate isAnHourOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -188,15 +215,6 @@
       _ -> Nothing
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "tisdag(en)?|tis?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleTheOrdinalCycleOfTime :: Rule
 ruleTheOrdinalCycleOfTime = Rule
   { name = "the <ordinal> <cycle> of <time>"
@@ -204,7 +222,7 @@
     [ regex "den"
     , dimension Ordinal
     , dimension TimeGrain
-    , regex "av|i|fr\x00e5n"
+    , regex "av|i|från"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -237,7 +255,7 @@
 ruleNewYearsDay = Rule
   { name = "new year's day"
   , pattern =
-    [ regex "ny\x00e5rsdag(en)?"
+    [ regex "nyårsdag(en)?"
     ]
   , prod = \_ -> tt $ monthDay 1 1
   }
@@ -246,7 +264,7 @@
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
-    [ regex "(sista|f\x00f6rra|senaste)"
+    [ regex "(sista|förra|senaste)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -255,15 +273,6 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "l\x00f6rdag(en)?|l\x00f6r\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 ruleDatetimeDatetimeInterval :: Rule
 ruleDatetimeDatetimeInterval = Rule
   { name = "<datetime> - <datetime> (interval)"
@@ -278,20 +287,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juli|jul\\.?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleEvening :: Rule
 ruleEvening = Rule
   { name = "evening"
   , pattern =
-    [ regex "kv\x00e4ll(en)?"
+    [ regex "kväll(en)?"
     ]
   , prod = \_ ->
       let from = hour False 18
@@ -345,7 +345,7 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "just nu|nu|(i )?detta \x00f6gonblick"
+    [ regex "just nu|nu|(i )?detta ögonblick"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -369,7 +369,7 @@
 ruleFromDatetimeDatetimeInterval = Rule
   { name = "from <datetime> - <datetime> (interval)"
   , pattern =
-    [ regex "fr\x00e5n"
+    [ regex "från"
     , dimension Time
     , regex "\\-|till|till och med|tom"
     , dimension Time
@@ -403,15 +403,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "torsdag(en)?|tors?\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleTheCycleAfterTime :: Rule
 ruleTheCycleAfterTime = Rule
   { name = "the <cycle> after <time>"
@@ -431,7 +422,7 @@
   { name = "the <cycle> before <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "(en|na|et)? f\x00f6re"
+    , regex "(en|na|et)? före"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -457,7 +448,7 @@
 ruleTimeAfterNext = Rule
   { name = "<time> after next"
   , pattern =
-    [ regex "n\x00e4sta"
+    [ regex "nästa"
     , dimension Time
     , regex "igen"
     ]
@@ -503,7 +494,7 @@
 ruleThisnextDayofweek = Rule
   { name = "this|next <day-of-week>"
   , pattern =
-    [ regex "(kommande|n\x00e4sta)"
+    [ regex "(kommande|nästa)"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -512,11 +503,23 @@
       _ -> Nothing
   }
 
+ruleLastDayofweek :: Rule
+ruleLastDayofweek = Rule
+  { name = "last <day-of-week>"
+  , pattern =
+    [ regex "i"
+    , Predicate isADayOfWeek
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token Time td:_) -> tt $ predNth (-1) True td
+      _ -> Nothing
+  }
+
 ruleTheDayBeforeYesterday :: Rule
 ruleTheDayBeforeYesterday = Rule
   { name = "the day before yesterday"
   , pattern =
-    [ regex "i f\x00f6rrg\x00e5r"
+    [ regex "i förrgår"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
@@ -540,7 +543,7 @@
 ruleNextCycle = Rule
   { name = "next <cycle>"
   , pattern =
-    [ regex "n\x00e4sta|kommande"
+    [ regex "nästa|kommande"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -549,15 +552,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "januari|jan\\.?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleTheCycleOfTime :: Rule
 ruleTheCycleOfTime = Rule
   { name = "the <cycle> of <time>"
@@ -588,7 +582,7 @@
 ruleOnDate = Rule
   { name = "on <date>"
   , pattern =
-    [ regex "den|p\x00e5|under"
+    [ regex "den|på|under"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -596,21 +590,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "mars|mar\\.?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleDurationFromNow :: Rule
 ruleDurationFromNow = Rule
   { name = "<duration> from now"
   , pattern =
     [ dimension Duration
-    , regex "fr\x00e5n (idag|nu)"
+    , regex "från (idag|nu)"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -635,7 +620,7 @@
 ruleLastCycle = Rule
   { name = "last <cycle>"
   , pattern =
-    [ regex "sista|senaste|f\x00f6rra"
+    [ regex "sista|senaste|f(ö)rra|f(ö)reg(å)ende"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -671,15 +656,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "april|apr\\.?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleTimeBeforeLast :: Rule
 ruleTimeBeforeLast = Rule
   { name = "<time> before last"
@@ -728,15 +704,6 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "fredag(en)?|fre\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleDayofmonthordinalNamedmonth :: Rule
 ruleDayofmonthordinalNamedmonth = Rule
   { name = "<day-of-month>(ordinal) <named-month>"
@@ -824,9 +791,9 @@
 ruleFromTimeofdayTimeofdayInterval = Rule
   { name = "from <time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ regex "(efter|fr\x00e5n)"
+    [ regex "(efter|från)"
     , Predicate isATimeOfDay
-    , regex "((men )?f\x00f6re)|\\-|till|till och med|tom"
+    , regex "((men )?före)|\\-|till|till och med|tom"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -835,15 +802,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "februari|feb\\.?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleExactlyTimeofday :: Rule
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
@@ -901,7 +859,7 @@
 ruleNewYearsEve = Rule
   { name = "new year's eve"
   , pattern =
-    [ regex "ny\x00e5rsafton?"
+    [ regex "nyårsafton?"
     ]
   , prod = \_ -> tt $ monthDay 12 31
   }
@@ -948,7 +906,7 @@
 ruleLastNCycle = Rule
   { name = "last n <cycle>"
   , pattern =
-    [ regex "sista|senaste|f\x00f6rra"
+    [ regex "sista|senaste|förra"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -975,7 +933,7 @@
 ruleWithinDuration = Rule
   { name = "within <duration>"
   , pattern =
-    [ regex "(innanf\x00f6r|inom)"
+    [ regex "(innanför|inom)"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -1036,7 +994,7 @@
 ruleUntilTimeofday = Rule
   { name = "until <time-of-day>"
   , pattern =
-    [ regex "innan|f\x00f6re|intill"
+    [ regex "innan|före|intill"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1058,15 +1016,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "juni|jun\\.?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -1085,15 +1034,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "augusti|aug\\.?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleTimePartofday :: Rule
 ruleTimePartofday = Rule
   { name = "<time> <part-of-day>"
@@ -1113,10 +1053,7 @@
   , pattern =
     [ regex "((week(\\s|-)?end)|helg)(en)?"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleEomendOfMonth :: Rule
@@ -1161,7 +1098,7 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "n\x00e4sta|kommande"
+    [ regex "nästa|kommande"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -1233,7 +1170,7 @@
 ruleNextNCycle = Rule
   { name = "next n <cycle>"
   , pattern =
-    [ regex "n\x00e4sta"
+    [ regex "nästa"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -1300,7 +1237,7 @@
 ruleThisTime = Rule
   { name = "this <time>"
   , pattern =
-    [ regex "(denna|detta|i|den h\x00e4r)"
+    [ regex "(denna|detta|i|den här)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1338,7 +1275,7 @@
 ruleOnANamedday = Rule
   { name = "on a named-day"
   , pattern =
-    [ regex "p\x00e5 en"
+    [ regex "på en"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -1363,7 +1300,7 @@
 ruleYesterday = Rule
   { name = "yesterday"
   , pattern =
-    [ regex "i g\x00e5r|ig\x00e5r"
+    [ regex "i går|igår"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -1448,7 +1385,7 @@
   , pattern =
     [ dimension Ordinal
     , dimension TimeGrain
-    , regex "av|i|fr\x00e5n"
+    , regex "av|i|från"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1457,24 +1394,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "maj"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "s\x00f6ndag(en)?|s\x00f6n\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleHhmm :: Rule
 ruleHhmm = Rule
   { name = "hh:mm"
@@ -1493,7 +1412,7 @@
 ruleTonight = Rule
   { name = "tonight"
   , pattern =
-    [ regex "ikv\x00e4ll"
+    [ regex "ikväll"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day 0
@@ -1514,15 +1433,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "oktober|okt\\.?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleNamedmonthDayofmonthNonOrdinal :: Rule
 ruleNamedmonthDayofmonthNonOrdinal = Rule
   { name = "<named-month> <day-of-month> (non ordinal)"
@@ -1567,7 +1477,7 @@
   { name = "<cycle> before <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "f\x00f6re"
+    , regex "före"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1595,7 +1505,7 @@
 ruleTimeofdayTimeofdayInterval = Rule
   { name = "<time-of-day> - <time-of-day> (interval)"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\-|till|till och med|tom"
     , Predicate isATimeOfDay
     ]
@@ -1605,15 +1515,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "november|nov\\.?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleDurationAfterTime :: Rule
 ruleDurationAfterTime = Rule
   { name = "<duration> after <time>"
@@ -1641,15 +1542,6 @@
       _ -> Nothing
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "onsdag(en)?|ons\\.?"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleTheDayofmonthOrdinal :: Rule
 ruleTheDayofmonthOrdinal = Rule
   { name = "the <day-of-month> (ordinal)"
@@ -1669,7 +1561,7 @@
   { name = "<duration> before <time>"
   , pattern =
     [ dimension Duration
-    , regex "f\x00f6re"
+    , regex "före"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -1723,15 +1615,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "september|sept?\\.?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleDayofmonthordinalNamedmonthYear :: Rule
 ruleDayofmonthordinalNamedmonthYear = Rule
   { name = "<day-of-month>(ordinal) <named-month> year"
@@ -1770,7 +1653,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1838,25 +1721,6 @@
   , ruleMidnighteodendOfDay
   , ruleMonthDdddInterval
   , ruleMorning
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonthNonOrdinal
   , ruleNamedmonthDayofmonthOrdinal
   , ruleNewYearsDay
@@ -1900,6 +1764,7 @@
   , ruleThisPartofday
   , ruleThisTime
   , ruleThisnextDayofweek
+  , ruleLastDayofweek
   , ruleTimeAfterNext
   , ruleTimeBeforeLast
   , ruleTimePartofday
@@ -1921,3 +1786,5 @@
   , ruleYyyymmdd
   , ruleTimezone
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
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
@@ -8,23 +8,24 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.VI.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
+import Duckling.Testing.Types hiding (examples)
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month, refTime)
 import Duckling.TimeGrain.Types hiding (add)
-import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
 corpus = (context, allExamples)
   where
     context = testContext
-      { lang = VI
+      { locale = makeLocale VI Nothing
       , referenceTime = refTime (2017, 2, 2, 3, 55, 0) (-2)
       }
 
diff --git a/Duckling/Time/VI/Rules.hs b/Duckling/Time/VI/Rules.hs
--- a/Duckling/Time/VI/Rules.hs
+++ b/Duckling/Time/VI/Rules.hs
@@ -12,8 +12,8 @@
 module Duckling.Time.VI.Rules
   ( rules ) where
 
-import Control.Monad (liftM2)
 import Prelude
+import Data.Text (Text)
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
@@ -33,25 +33,61 @@
 ruleTtDng = Rule
   { name = "tết dương"
   , pattern =
-    [ regex "(t(\x1ebf)t d(\x01b0)(\x01a1)ng)(l(\x1ecb)ch)?"
+    [ regex "(t(ế)t d(ư)(ơ)ng)(l(ị)ch)?"
     ]
   , prod = \_ -> tt $ monthDay 1 1
   }
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "th(\x1ee9) (2|hai)"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Monday"   , "th(ứ) (2|hai)"                                      )
+  , ( "Tuesday"  , "th(ứ) (3|ba)"                                       )
+  , ( "Wednesday", "th(ứ) 4|th(ứ) b(ố)n|th(ứ) t(ư)" )
+  , ( "Thursday" , "th(ứ) (5|n(ă)m)"                               )
+  , ( "Friday"   , "th(ứ) 6|th(ứ) s(á)u"                      )
+  , ( "Saturday" , "th(ứ) (7|b((ả)|(ẩ))y)"                    )
+  , ( "Sunday"   , "ch(ủ) nh(ậ)t"                                  )
+  ]
 
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "January"  , "th(á)ng (gi(ê)ng|m(ộ)t)"         )
+  , ( "February" , "th(á)ng hai"                               )
+  , ( "March"    , "th(á)ng ba"                                )
+  , ( "April"    , "th(á)ng t(ư)|th(á)ng b(ố)n" )
+  , ( "May"      , "th(á)ng n(ă)m"                        )
+  , ( "June"     , "th(á)ng s(á)u"                        )
+  , ( "July"     , "th(á)ng b(ả)y"                        )
+  , ( "August"   , "th(á)ng t(á)m"                        )
+  , ( "September", "th(á)ng ch(í)n"                       )
+  , ( "October"  , "th(á)ng m(ư)(ờ)i"                )
+  , ( "November" , "th(á)ng m(ư)(ờ)i m(ộ)t"     )
+  , ( "December" , "th(á)ng m(ư)(ờ)i hai"            )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 ruleDayofmonthNamedmonth :: Rule
 ruleDayofmonthNamedmonth = Rule
   { name = "<day-of-month> (numeric with day symbol) <named-month>"
   , pattern =
-    [ regex "(ng(\x00e0)y|m(\x1ed3)ng)( m(\x1ed3)ng)?"
+    [ regex "(ng(à)y|m(ồ)ng)( m(ồ)ng)?"
     , Predicate isDOMInteger
     , Predicate isAMonth
     ]
@@ -65,8 +101,8 @@
   { name = "<day-of-week> cuối cùng của <time>"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "cu(\x1ed1)i c(\x00f9)ng|cu(\x1ed1)i"
-    , regex "c(\x1ee7)a|trong|v(\x00e0)o"
+    , regex "cu(ố)i c(ù)ng|cu(ố)i"
+    , regex "c(ủ)a|trong|v(à)o"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -79,7 +115,7 @@
   { name = "<time> tới"
   , pattern =
     [ Predicate isNotLatent
-    , regex "t(\x1edb)i"
+    , regex "t(ớ)i"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ predNth 0 True td
@@ -91,8 +127,8 @@
   { name = "<cycle> cuối cùng của <time>"
   , pattern =
     [ dimension TimeGrain
-    , regex "cu(\x1ed1)i c(\x00f9)ng|cu(\x1ed1)i"
-    , regex "c(\x1ee7)a|trong|v(\x00e0)o"
+    , regex "cu(ố)i c(ù)ng|cu(ố)i"
+    , regex "c(ủ)a|trong|v(à)o"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -101,20 +137,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng m(\x01b0)(\x1edd)i hai"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleTimeofdayLatent2 :: Rule
 ruleTimeofdayLatent2 = Rule
   { name = "time-of-day (latent)"
   , pattern =
-    [ regex "(l(\x00fa)c|v(\x00e0)o)( l(\x00fa)c)?"
+    [ regex "(l(ú)c|v(à)o)( l(ú)c)?"
     , Predicate $ isIntegerBetween 0 23
     ]
   , prod = \tokens -> case tokens of
@@ -128,47 +155,29 @@
 ruleCchMngThng = Rule
   { name = "cách mạng tháng 8"
   , pattern =
-    [ regex "c(\x00e1)ch m(\x1ea1)ng th(\x00e1)ng (8|t(\x00e1)m)"
+    [ regex "c(á)ch m(ạ)ng th(á)ng (8|t(á)m)"
     ]
   , prod = \_ -> tt $ monthDay 8 19
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "th(\x1ee9) (3|ba)"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleTimeofdayGiNg :: Rule
 ruleTimeofdayGiNg = Rule
   { name = "<time-of-day> giờ đúng"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "gi(\x1edd) (\x0111)(\x00fa)ng"
+    , regex "gi(ờ) (đ)(ú)ng"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "th(\x1ee9) (7|b((\x1ea3)|(\x1ea9))y)"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
 rulePartofdayHmNay :: Rule
 rulePartofdayHmNay = Rule
   { name = "<part-of-day> (hôm )?nay"
   , pattern =
     [ Predicate isAPartOfDay
-    , regex "(h(\x00f4)m )?nay"
+    , regex "(h(ô)m )?nay"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -176,20 +185,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng b(\x1ea3)y"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleNgyDdmmyyyy :: Rule
 ruleNgyDdmmyyyy = Rule
   { name = "ngày dd/mm/yyyy"
   , pattern =
-    [ regex "ng(\x00e0)y"
+    [ regex "ng(à)y"
     , regex "(3[01]|[12]\\d|0?[1-9])[-/](0?[1-9]|1[0-2])[/-](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
@@ -201,15 +201,6 @@
       _ -> Nothing
   }
 
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "th(\x1ee9) (5|n(\x0103)m)"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 rulePartofdayTime :: Rule
 rulePartofdayTime = Rule
   { name = "<part-of-day> <time>"
@@ -241,7 +232,7 @@
 ruleSeason4 = Rule
   { name = "season"
   , pattern =
-    [ regex "m(\x00f9)a? xu(\x00e2)n"
+    [ regex "m(ù)a? xu(â)n"
     ]
   , prod = \_ ->
       Token Time <$> interval TTime.Open (monthDay 3 20) (monthDay 6 21)
@@ -251,7 +242,7 @@
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "(bu(\x1ed5)i )?(t(\x1ed1)i|(\x0111)(\x00ea)m)"
+    [ regex "(bu(ổ)i )?(t(ố)i|(đ)(ê)m)"
     ]
   , prod = \_ -> tt $ hour False 12
   }
@@ -260,7 +251,7 @@
 ruleQucTLaoNg = Rule
   { name = "quốc tế lao động"
   , pattern =
-    [ regex "(ng(\x00e0)y )?qu(\x1ed1)c t(\x1ebf) lao (\x0111)(\x00f4)ng"
+    [ regex "(ng(à)y )?qu(ố)c t(ế) lao (đ)(ô)ng"
     ]
   , prod = \_ -> tt $ monthDay 5 1
   }
@@ -270,28 +261,19 @@
   { name = "next <cycle>"
   , pattern =
     [ dimension TimeGrain
-    , regex "(t(\x1edb)i|k(\x1ebf)|sau|ti(\x1ebf)p)( theo)?( ti(\x1ebf)p)?"
+    , regex "(t(ớ)i|k(ế)|sau|ti(ế)p)( theo)?( ti(ế)p)?"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) -> tt $ cycleNth grain 1
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng (gi(\x00ea)ng|m(\x1ed9)t)"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
 ruleTimeofdayApproximately :: Rule
 ruleTimeofdayApproximately = Rule
   { name = "<time-of-day> approximately"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "g(\x1ea7)n"
+    , regex "g(ầ)n"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -304,7 +286,7 @@
   , pattern =
     [ Predicate $ isGrain TG.Quarter
     , dimension Numeral
-    , regex "c(\x1ee7)a|trong"
+    , regex "c(ủ)a|trong"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -314,20 +296,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng ba"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleLunch :: Rule
 ruleLunch = Rule
   { name = "lunch"
   , pattern =
-    [ regex "(bu(\x1ed5)i )?tr(\x01b0)a"
+    [ regex "(bu(ổ)i )?tr(ư)a"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 12) (hour False 14)
@@ -338,7 +311,7 @@
   { name = "last <cycle>"
   , pattern =
     [ dimension TimeGrain
-    , regex "tr(\x01b0)(\x1edb)c|qua|v(\x1eeb)a r(\x1ed3)i|ngo(\x00e1)i"
+    , regex "tr(ư)(ớ)c|qua|v(ừ)a r(ồ)i|ngo(á)i"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) -> tt . cycleNth grain $ - 1
@@ -363,26 +336,17 @@
 ruleAfternoon = Rule
   { name = "afternoon"
   , pattern =
-    [ regex "(bu(\x1ed5)i )?chi(\x1ec1)u"
+    [ regex "(bu(ổ)i )?chi(ề)u"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 12) (hour False 19)
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng t(\x01b0)|th(\x00e1)ng b(\x1ed1)n"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleHmNay :: Rule
 ruleHmNay = Rule
   { name = "hôm nay"
   , pattern =
-    [ regex "((ngay )?h(\x00f4)m|b(\x1eef)a) nay"
+    [ regex "((ngay )?h(ô)m|b(ữ)a) nay"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 0
   }
@@ -391,7 +355,7 @@
 ruleAtHhmm = Rule
   { name = "at hh:mm"
   , pattern =
-    [ regex "(l(\x00fa)c|v(\x00e0)o)( l(\x00fa)c)?"
+    [ regex "(l(ú)c|v(à)o)( l(ú)c)?"
     , regex "((?:[01]?\\d)|(?:2[0-3]))[:.hg]([0-5]\\d)"
     ]
   , prod = \tokens -> case tokens of
@@ -423,7 +387,7 @@
   { name = "(hour-of-day) quarter"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "k(\x00e9)m"
+    , regex "k(é)m"
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -438,7 +402,7 @@
   { name = "(hour-of-day) half"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "r(\x01b0)(\x1ee1)i"
+    , regex "r(ư)(ỡ)i"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) ->
@@ -452,7 +416,7 @@
   , pattern =
     [ Predicate isAnHourOfDay
     , Predicate $ isIntegerBetween 1 59
-    , regex "ph(\x00fa)t"
+    , regex "ph(ú)t"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:
@@ -463,20 +427,11 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "th(\x1ee9) 6|th(\x1ee9) s(\x00e1)u"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleCuiNm :: Rule
 ruleCuiNm = Rule
   { name = "cuối năm"
   , pattern =
-    [ regex "cu(\x1ed1)i n(\x0103)m"
+    [ regex "cu(ố)i n(ă)m"
     ]
   , prod = \_ -> tt $ cycleNth TG.Year 1
   }
@@ -509,20 +464,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng hai"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleExactlyTimeofday :: Rule
 ruleExactlyTimeofday = Rule
   { name = "exactly <time-of-day>"
   , pattern =
-    [ regex "(v(\x00e0)o )?(\x0111)(\x00fa)ng"
+    [ regex "(v(à)o )?(đ)(ú)ng"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -534,7 +480,7 @@
 ruleNgyHmQua = Rule
   { name = "ngày hôm qua"
   , pattern =
-    [ regex "(ng(\x00e0)y )?(h(\x00f4)m )?qua"
+    [ regex "(ng(à)y )?(h(ô)m )?qua"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -543,7 +489,7 @@
 ruleSeason3 = Rule
   { name = "season"
   , pattern =
-    [ regex "m(\x00f9)a? (\x0111)(\x00f4)ng"
+    [ regex "m(ù)a? (đ)(ô)ng"
     ]
   , prod = \_ ->
       Token Time <$> interval TTime.Open (monthDay 12 21) (monthDay 3 20)
@@ -553,7 +499,7 @@
 ruleSeason = Rule
   { name = "season"
   , pattern =
-    [ regex "m(\x00f9)a? (h(\x00e8)|h(\x1ea1))"
+    [ regex "m(ù)a? (h(è)|h(ạ))"
     ]
   , prod = \_ ->
       Token Time <$> interval TTime.Open (monthDay 6 21) (monthDay 9 23)
@@ -575,7 +521,7 @@
 ruleYearNumericWithYearSymbol = Rule
   { name = "year (numeric with year symbol)"
   , pattern =
-    [ regex "n(\x0103)m"
+    [ regex "n(ă)m"
     , Predicate $ isIntegerBetween 1000 9999
     ]
   , prod = \tokens -> case tokens of
@@ -589,7 +535,7 @@
 ruleAfterWork = Rule
   { name = "after work"
   , pattern =
-    [ regex "(sau gi(\x1edd) l(\x00e0)m|sau gi(\x1edd) tan t(\x1ea7)m|l(\x00fa)c tan t(\x1ea7)m)"
+    [ regex "(sau gi(ờ) l(à)m|sau gi(ờ) tan t(ầ)m|l(ú)c tan t(ầ)m)"
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 17) (hour False 21)
@@ -603,7 +549,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
-    , regex "tr(\x01b0)(\x1edb)c|qua|v(\x1eeb)a r(\x1ed3)i|ngo(\x00e1)i|v(\x1eeb)a qua"
+    , regex "tr(ư)(ớ)c|qua|v(ừ)a r(ồ)i|ngo(á)i|v(ừ)a qua"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -617,7 +563,7 @@
   { name = "<time-of-day> sharp"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(\x0111)(\x00fa)ng"
+    , regex "(đ)(ú)ng"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -640,7 +586,7 @@
 ruleAboutTimeofday = Rule
   { name = "about <time-of-day>"
   , pattern =
-    [ regex "(v(\x00e0)o )?kho(\x1ea3)ng"
+    [ regex "(v(à)o )?kho(ả)ng"
     , Predicate isATimeOfDay
     ]
   , prod = \tokens -> case tokens of
@@ -652,34 +598,16 @@
 ruleLTnhNhn = Rule
   { name = "lễ tình nhân"
   , pattern =
-    [ regex "(ng(\x00e0)y )?(l(\x1ec5))? t(\x00ec)nh nh(\x00e2)n"
+    [ regex "(ng(à)y )?(l(ễ))? t(ì)nh nh(â)n"
     ]
   , prod = \_ -> tt $ monthDay 2 14
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng s(\x00e1)u"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng t(\x00e1)m"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleCuiThng :: Rule
 ruleCuiThng = Rule
   { name = "cuối tháng"
   , pattern =
-    [ regex "cu(\x1ed1)i th(\x00e1)ng"
+    [ regex "cu(ố)i th(á)ng"
     ]
   , prod = \_ -> tt $ cycleNth TG.Month 1
   }
@@ -688,12 +616,9 @@
 ruleWeekend = Rule
   { name = "week-end"
   , pattern =
-    [ regex "(cu(\x1ed1)i|h(\x1ebf)t) tu(\x1ea7)n"
+    [ regex "(cu(ố)i|h(ế)t) tu(ầ)n"
     ]
-  , prod = \_ -> do
-      fri <- intersect (dayOfWeek 5) (hour False 18)
-      mon <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open fri mon
+  , prod = \_ -> tt weekend
   }
 
 ruleTimeofdaySngchiuti :: Rule
@@ -701,7 +626,7 @@
   { name = "<time-of-day> sáng|chiều|tối"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "(s(\x00e1)ng|chi(\x1ec1)u|t(\x1ed1)i)"
+    , regex "(s(á)ng|chi(ề)u|t(ố)i)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:Token RegexMatch (GroupMatch (ap:_)):_) ->
@@ -714,7 +639,7 @@
   { name = "<time> trước"
   , pattern =
     [ dimension Time
-    , regex "tr(\x01b0)(\x1edb)c|v(\x1eeb)a r(\x1ed3)i"
+    , regex "tr(ư)(ớ)c|v(ừ)a r(ồ)i"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ predNth (-1) False td
@@ -726,7 +651,7 @@
   { name = "time-of-day giờ"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "gi(\x1edd)"
+    , regex "gi(ờ)"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ notLatent td
@@ -737,7 +662,7 @@
 ruleQucKhnh = Rule
   { name = "quốc khánh"
   , pattern =
-    [ regex "qu(\x1ed1)c kh(\x00e1)nh"
+    [ regex "qu(ố)c kh(á)nh"
     ]
   , prod = \_ -> tt $ monthDay 9 3
   }
@@ -762,7 +687,7 @@
   { name = "intersect by \"of\", \"from\", \"'s\""
   , pattern =
     [ Predicate isNotLatent
-    , regex "c(\x1ee7)a|trong"
+    , regex "c(ủ)a|trong"
     , Predicate isNotLatent
     ]
   , prod = \tokens -> case tokens of
@@ -776,7 +701,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
-    , regex "(t(\x1edb)i|k(\x1ebf)|sau|ti(\x1ebf)p)( theo)?( ti(\x1ebf)p)?"
+    , regex "(t(ớ)i|k(ế)|sau|ti(ế)p)( theo)?( ti(ế)p)?"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -789,7 +714,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "(bu(\x1ed5)i )?s(\x00e1)ng"
+    [ regex "(bu(ổ)i )?s(á)ng"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 4) (hour False 12)
@@ -800,7 +725,7 @@
   { name = "this <cycle>"
   , pattern =
     [ dimension TimeGrain
-    , regex "nay|n(\x00e0)y|hi(\x1ec7)n t(\x1ea1)i|h(\x00f4)m nay|n(\x0103)m nay"
+    , regex "nay|n(à)y|hi(ệ)n t(ạ)i|h(ô)m nay|n(ă)m nay"
     ]
   , prod = \tokens -> case tokens of
       (Token TimeGrain grain:_) ->
@@ -812,7 +737,7 @@
 ruleNoon2 = Rule
   { name = "noon"
   , pattern =
-    [ regex "(bu(\x1ed5)i )?(t(\x1ed1)i|(\x0111)(\x00ea)m)"
+    [ regex "(bu(ổ)i )?(t(ố)i|(đ)(ê)m)"
     ]
   , prod = \_ -> Token Time . partOfDay . mkLatent <$>
       interval TTime.Open (hour False 18) (hour False 0)
@@ -822,7 +747,7 @@
 ruleAfterLunch = Rule
   { name = "after lunch"
   , pattern =
-    [ regex "(sau|qua) (bu(\x1ed5)i |b(\x1eef)a )?tr(\x01b0)a"
+    [ regex "(sau|qua) (bu(ổ)i |b(ữ)a )?tr(ư)a"
     ]
   , prod = \_ -> do
       td <- interval TTime.Open (hour False 13) (hour False 17)
@@ -834,7 +759,7 @@
 ruleSeason2 = Rule
   { name = "season"
   , pattern =
-    [ regex "m(\x00f9)a? thu"
+    [ regex "m(ù)a? thu"
     ]
   , prod = \_ ->
       Token Time <$> interval TTime.Open (monthDay 9 23) (monthDay 12 21)
@@ -845,7 +770,7 @@
   { name = "<time> này"
   , pattern =
     [ dimension Time
-    , regex "n(\x00e0)y|nay"
+    , regex "n(à)y|nay"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> tt $ predNth 0 False td
@@ -869,7 +794,7 @@
 ruleNgyMai = Rule
   { name = "ngày mai"
   , pattern =
-    [ regex "(ng(\x00e0)y )?mai"
+    [ regex "(ng(à)y )?mai"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -880,7 +805,7 @@
   , pattern =
     [ dimension TimeGrain
     , dimension Ordinal
-    , regex "c(\x1ee7)a|trong"
+    , regex "c(ủ)a|trong"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -889,29 +814,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng n(\x0103)m"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "ch(\x1ee7) nh(\x1ead)t"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 ruleMonthNumericWithMonthSymbol :: Rule
 ruleMonthNumericWithMonthSymbol = Rule
   { name = "month (numeric with month symbol)"
   , pattern =
-    [ regex "th(\x00e1)ng"
+    [ regex "th(á)ng"
     , Predicate $ isIntegerBetween 1 12
     ]
   , prod = \tokens -> case tokens of
@@ -939,7 +846,7 @@
 ruleTonight = Rule
   { name = "tonight"
   , pattern =
-    [ regex "(t(\x1ed1)i|(\x0111)(\x00ea)m)( h(\x00f4)m)? nay"
+    [ regex "(t(ố)i|(đ)(ê)m)( h(ô)m)? nay"
     ]
   , prod = \_ -> do
       let today = cycleNth TG.Day 0
@@ -951,7 +858,7 @@
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) (isGrainFinerThan TG.Day) isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isGrainFinerThan TG.Day]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -961,20 +868,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng m(\x01b0)(\x1edd)i"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleByGi :: Rule
 ruleByGi = Rule
   { name = "bây giờ"
   , pattern =
-    [ regex "(ngay )?(b(\x00e2)y gi(\x1edd)|l(\x00fa)c n(\x00e0)y)"
+    [ regex "(ngay )?(b(â)y gi(ờ)|l(ú)c n(à)y)"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
@@ -983,7 +881,7 @@
 ruleNgyDdmm = Rule
   { name = "ngày dd/mm"
   , pattern =
-    [ regex "ng(\x00e0)y"
+    [ regex "ng(à)y"
     , regex "(3[01]|[12]\\d|0?[1-9])/(0?[1-9]|1[0-2])"
     ]
   , prod = \tokens -> case tokens of
@@ -1017,7 +915,7 @@
   { name = "hhmm (military) sáng|chiều|tối"
   , pattern =
     [ regex "((?:1[012]|0?\\d))([0-5]\\d)"
-    , regex "(s(\x00e1)ng|chi(\x1ec1)u|t(\x1ed1)i)"
+    , regex "(s(á)ng|chi(ề)u|t(ố)i)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (hh:mm:_)):
@@ -1045,38 +943,20 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng m(\x01b0)(\x1edd)i m(\x1ed9)t"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleGingSinh :: Rule
 ruleGingSinh = Rule
   { name = "giáng sinh"
   , pattern =
-    [ regex "(ng(\x00e0)y )(xmas|christmas|gi(\x00e1)ng sinh)?"
+    [ regex "(ng(à)y )(xmas|christmas|gi(á)ng sinh)?"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "th(\x1ee9) 4|th(\x1ee9) b(\x1ed1)n|th(\x1ee9) t(\x01b0)"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleNgyHmKia :: Rule
 ruleNgyHmKia = Rule
   { name = "ngày hôm kia"
   , pattern =
-    [ regex "(ng(\x00e0)y )?h(\x00f4)m kia"
+    [ regex "(ng(à)y )?h(ô)m kia"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
@@ -1086,7 +966,7 @@
   { name = "<day-of-week> tới"
   , pattern =
     [ Predicate isADayOfWeek
-    , regex "t(\x1edb)i"
+    , regex "t(ớ)i"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -1094,15 +974,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "th(\x00e1)ng ch(\x00ed)n"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleHhmmss :: Rule
 ruleHhmmss = Rule
   { name = "hh:mm:ss"
@@ -1155,25 +1026,6 @@
   , ruleLunch
   , ruleMonthNumericWithMonthSymbol
   , ruleMorning
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNextCycle
   , ruleNextNCycle
   , ruleNgyDdmm
@@ -1214,3 +1066,5 @@
   , ruleYearNumericWithYearSymbol
   , ruleYyyymmdd
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
diff --git a/Duckling/Time/ZH/CN/Corpus.hs b/Duckling/Time/ZH/CN/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/CN/Corpus.hs
@@ -0,0 +1,37 @@
+-- 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.Time.ZH.CN.Corpus
+  ( allExamples
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 10, 1, 0, 0, 0) Day)
+             [ "国庆"
+             , "國慶"
+             , "国庆节"
+             , "国庆節"
+             , "國慶节"
+             , "國慶節"
+             ]
+  , examples (datetimeInterval ((2013, 10, 1, 18, 0, 0), (2013, 10, 2, 0, 0, 0)) Hour)
+             [ "国庆节晚上"
+             , "國慶節晚上"
+             ]
+  ]
diff --git a/Duckling/Time/ZH/CN/Rules.hs b/Duckling/Time/ZH/CN/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/CN/Rules.hs
@@ -0,0 +1,35 @@
+-- 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.Time.ZH.CN.Rules
+  ( rules
+  ) where
+
+import Prelude
+
+import Duckling.Regex.Types
+import Duckling.Time.Helpers
+import Duckling.Types
+
+ruleNationalDay :: Rule
+ruleNationalDay = Rule
+  { name = "national day"
+  , pattern =
+    [ regex "(国庆|國慶)(节|節)?"
+    ]
+  , prod = \_ -> tt $ monthDay 10 1
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleNationalDay
+  ]
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
@@ -9,19 +9,24 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.ZH.Corpus
-  ( corpus ) where
+  ( corpus
+  , defaultCorpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Time.Corpus
 import Duckling.TimeGrain.Types hiding (add)
 import Duckling.Testing.Types hiding (examples)
 
+defaultCorpus :: Corpus
+defaultCorpus = corpus
+
 corpus :: Corpus
-corpus = (testContext {lang = ZH}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -239,6 +244,9 @@
              , "今個星期二"
              , "今個礼拜二"
              , "今個禮拜二"
+             , "今星期二"
+             , "今礼拜二"
+             , "今禮拜二"
              ]
   , examples (datetime (2013, 2, 11, 0, 0, 0) Week)
              [ "这周"
@@ -479,21 +487,11 @@
              [ "建军节"
              , "建軍節"
              ]
-  , examples (datetime (2013, 10, 1, 0, 0, 0) Day)
-             [ "国庆"
-             , "國慶"
-             , "国庆节"
-             , "國慶節"
-             ]
   , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
              [ "圣诞"
              , "聖誕"
              , "圣诞节"
              , "聖誕節"
-             ]
-  , examples (datetimeInterval ((2013, 10, 1, 18, 0, 0), (2013, 10, 2, 0, 0, 0)) Hour)
-             [ "国庆节晚上"
-             , "國慶節晚上"
              ]
   , examples (datetime (2013, 6, 1, 15, 15, 0) Minute)
              [ "儿童节下午三点十五"
diff --git a/Duckling/Time/ZH/HK/Corpus.hs b/Duckling/Time/ZH/HK/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/HK/Corpus.hs
@@ -0,0 +1,37 @@
+-- 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.Time.ZH.HK.Corpus
+  ( allExamples
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 10, 1, 0, 0, 0) Day)
+             [ "国庆"
+             , "國慶"
+             , "国庆节"
+             , "国庆節"
+             , "國慶节"
+             , "國慶節"
+             ]
+  , examples (datetimeInterval ((2013, 10, 1, 18, 0, 0), (2013, 10, 2, 0, 0, 0)) Hour)
+             [ "国庆节晚上"
+             , "國慶節晚上"
+             ]
+  ]
diff --git a/Duckling/Time/ZH/HK/Rules.hs b/Duckling/Time/ZH/HK/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/HK/Rules.hs
@@ -0,0 +1,35 @@
+-- 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.Time.ZH.HK.Rules
+  ( rules
+  ) where
+
+import Prelude
+
+import Duckling.Regex.Types
+import Duckling.Time.Helpers
+import Duckling.Types
+
+ruleNationalDay :: Rule
+ruleNationalDay = Rule
+  { name = "national day"
+  , pattern =
+    [ regex "(国庆|國慶)(节|節)?"
+    ]
+  , prod = \_ -> tt $ monthDay 10 1
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleNationalDay
+  ]
diff --git a/Duckling/Time/ZH/MO/Corpus.hs b/Duckling/Time/ZH/MO/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/MO/Corpus.hs
@@ -0,0 +1,37 @@
+-- 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.Time.ZH.MO.Corpus
+  ( allExamples
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 10, 1, 0, 0, 0) Day)
+             [ "国庆"
+             , "國慶"
+             , "国庆节"
+             , "国庆節"
+             , "國慶节"
+             , "國慶節"
+             ]
+  , examples (datetimeInterval ((2013, 10, 1, 18, 0, 0), (2013, 10, 2, 0, 0, 0)) Hour)
+             [ "国庆节晚上"
+             , "國慶節晚上"
+             ]
+  ]
diff --git a/Duckling/Time/ZH/MO/Rules.hs b/Duckling/Time/ZH/MO/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/MO/Rules.hs
@@ -0,0 +1,35 @@
+-- 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.Time.ZH.MO.Rules
+  ( rules
+  ) where
+
+import Prelude
+
+import Duckling.Regex.Types
+import Duckling.Time.Helpers
+import Duckling.Types
+
+ruleNationalDay :: Rule
+ruleNationalDay = Rule
+  { name = "national day"
+  , pattern =
+    [ regex "(国庆|國慶)(节|節)?"
+    ]
+  , prod = \_ -> tt $ monthDay 10 1
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleNationalDay
+  ]
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
@@ -11,55 +11,38 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Time.ZH.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
-import Control.Monad (liftM2)
-import qualified Data.Text as Text
+import Data.Text (Text)
 import Prelude
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
-import qualified Duckling.Ordinal.Types as TOrdinal
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
+import Duckling.Types
+import qualified Duckling.Ordinal.Types as TOrdinal
 import qualified Duckling.Time.Types as TTime
 import qualified Duckling.TimeGrain.Types as TG
-import Duckling.Types
 
-ruleNamedday :: Rule
-ruleNamedday = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "\x661f\x671f\x4e00|\x5468\x4e00|\x793c\x62dc\x4e00|\x79ae\x62dc\x4e00|\x9031\x4e00"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 1
-  }
-
 ruleTheDayAfterTomorrow :: Rule
 ruleTheDayAfterTomorrow = Rule
   { name = "the day after tomorrow"
   , pattern =
-    [ regex "\x540e\x5929|\x5f8c\x5929|\x5f8c\x65e5"
+    [ regex "后天|後天|後日"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 2
   }
 
-ruleNamedmonth12 :: Rule
-ruleNamedmonth12 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x5341\x4e8c\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 12
-  }
-
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
 ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
   { name = "relative minutes to|till|before <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "(\x70b9|\x9ede)\x5dee"
+    , regex "(点|點)差"
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -75,7 +58,7 @@
   { name = "relative minutes to|till|before noon|midnight"
   , pattern =
     [ Predicate isMidnightOrNoon
-    , regex "\x5dee"
+    , regex "差"
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -91,7 +74,7 @@
   { name = "relative minutes after|past <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x70b9|\x9ede"
+    , regex "点|點"
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -109,7 +92,7 @@
   { name = "relative minutes after|past noon|midnight"
   , pattern =
     [ Predicate isMidnightOrNoon
-    , regex "\x8fc7|\x904e"
+    , regex "过|\x904e"
     , Predicate $ isIntegerBetween 1 59
     ]
   , prod = \tokens -> case tokens of
@@ -127,8 +110,8 @@
   { name = "quarter to|till|before <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "(\x70b9|\x9ede)\x5dee"
-    , regex "\x4e00\x523b"
+    , regex "(点|點)差"
+    , regex "一刻"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> Token Time <$> minutesBefore 15 td
@@ -139,8 +122,8 @@
   { name = "quarter to|till|before noon|midnight"
   , pattern =
     [ Predicate isMidnightOrNoon
-    , regex "\x5dee"
-    , regex "\x4e00\x523b"
+    , regex "差"
+    , regex "一刻"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> Token Time <$> minutesBefore 15 td
@@ -151,8 +134,8 @@
   { name = "quarter after|past <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x70b9|\x9ede"
-    , regex "\x4e00\x523b"
+    , regex "点|點"
+    , regex "一刻"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -164,8 +147,8 @@
   { name = "quarter after|past noon|midnight"
   , pattern =
     [ Predicate isMidnightOrNoon
-    , regex "\x8fc7"
-    , regex "\x4e00\x523b"
+    , regex "过"
+    , regex "一刻"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -178,8 +161,8 @@
   { name = "half to|till|before <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "(\x70b9|\x9ede)\x5dee"
-    , regex "\x534a"
+    , regex "(点|點)差"
+    , regex "半"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> Token Time <$> minutesBefore 30 td
@@ -190,8 +173,8 @@
   { name = "half to|till|before noon|midnight"
   , pattern =
     [ Predicate isMidnightOrNoon
-    , regex "\x5dee"
-    , regex "\x534a"
+    , regex "差"
+    , regex "半"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) -> Token Time <$> minutesBefore 30 td
@@ -202,8 +185,8 @@
   { name = "half after|past <integer> (hour-of-day)"
   , pattern =
     [ Predicate isAnHourOfDay
-    , regex "\x70b9|\x9ede"
-    , regex "\x534a"
+    , regex "点|點"
+    , regex "半"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -215,8 +198,8 @@
   { name = "half after|past noon|midnight"
   , pattern =
     [ Predicate isMidnightOrNoon
-    , regex "\x8fc7"
-    , regex "\x534a"
+    , regex "过"
+    , regex "半"
     ]
   , prod = \tokens -> case tokens of
       (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) _)}:
@@ -224,20 +207,11 @@
       _ -> Nothing
   }
 
-ruleNamedday2 :: Rule
-ruleNamedday2 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "\x661f\x671f\x4e8c|\x5468\x4e8c|\x793c\x62dc\x4e8c|\x79ae\x62dc\x4e8c|\x9031\x4e8c"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 2
-  }
-
 ruleValentinesDay :: Rule
 ruleValentinesDay = Rule
   { name = "valentine's day"
   , pattern =
-    [ regex "\x60c5\x4eba(\x8282|\x7bc0)"
+    [ regex "情人(节|節)"
     ]
   , prod = \_ -> tt $ monthDay 2 14
   }
@@ -260,7 +234,7 @@
 ruleThisDayofweek = Rule
   { name = "this <day-of-week>"
   , pattern =
-    [ regex "\x8fd9|\x9019|\x4eca(\x4e2a|\x500b)"
+    [ regex "这|這|今(个|個)?"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -274,7 +248,7 @@
   { name = "nth <time> of <time>"
   , pattern =
     [ dimension Time
-    , regex "\x7684"
+    , regex "的"
     , dimension Ordinal
     , dimension Time
     ]
@@ -288,7 +262,7 @@
 ruleNewYearsDay = Rule
   { name = "new year's day"
   , pattern =
-    [ regex "\x5143\x65e6(\x8282|\x7bc0)?"
+    [ regex "元旦(节|節)?"
     ]
   , prod = \_ -> tt $ monthDay 1 1
   }
@@ -297,7 +271,7 @@
 ruleLastTime = Rule
   { name = "last <time>"
   , pattern =
-    [ regex "\x53bb|\x4e0a(\x4e2a|\x500b)?"
+    [ regex "去|上(个|個)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -306,29 +280,11 @@
       _ -> Nothing
   }
 
-ruleNamedday6 :: Rule
-ruleNamedday6 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "\x661f\x671f\x516d|\x5468\x516d|\x793c\x62dc\x516d|\x79ae\x62dc\x516d|\x9031\x516d"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 6
-  }
-
-ruleNamedmonth7 :: Rule
-ruleNamedmonth7 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x4e03\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 7
-  }
-
 ruleInDuration :: Rule
 ruleInDuration = Rule
   { name = "in <duration>"
   , pattern =
-    [ regex "\x518d"
+    [ regex "再"
     , dimension Duration
     ]
   , prod = \tokens -> case tokens of
@@ -341,36 +297,18 @@
 ruleNow = Rule
   { name = "now"
   , pattern =
-    [ regex "\x73b0\x5728|\x6b64\x65f6|\x6b64\x523b|\x5f53\x524d|\x73fe\x5728|\x6b64\x6642|\x7576\x524d|\x5b9c\x5bb6|\x800c\x5bb6|\x4f9d\x5bb6"
+    [ regex "现在|此时|此刻|当前|現在|此時|當前|\x5b9c\x5bb6|\x800c\x5bb6|\x4f9d\x5bb6"
     ]
   , prod = \_ -> tt $ cycleNth TG.Second 0
   }
 
-ruleNationalDay :: Rule
-ruleNationalDay = Rule
-  { name = "national day"
-  , pattern =
-    [ regex "(\x56fd\x5e86|\x570b\x6176)(\x8282|\x7bc0)?"
-    ]
-  , prod = \_ -> tt $ monthDay 10 1
-  }
-
-ruleNamedday4 :: Rule
-ruleNamedday4 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "\x661f\x671f\x56db|\x5468\x56db|\x793c\x62dc\x56db|\x79ae\x62dc\x56db|\x9031\x56db"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 4
-  }
-
 ruleTheCycleAfterTime :: Rule
 ruleTheCycleAfterTime = Rule
   { name = "the <cycle> after <time>"
   , pattern =
-    [ regex "\x90a3"
+    [ regex "那"
     , dimension TimeGrain
-    , regex "(\x4e4b)?(\x540e|\x5f8c)"
+    , regex "(之)?(后|後)"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -383,9 +321,9 @@
 ruleTheCycleBeforeTime = Rule
   { name = "the <cycle> before <time>"
   , pattern =
-    [ regex "\x90a3"
+    [ regex "那"
     , dimension TimeGrain
-    , regex "(\x4e4b)?\x524d"
+    , regex "(之)?前"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -398,7 +336,7 @@
 ruleNoon = Rule
   { name = "noon"
   , pattern =
-    [ regex "\x4e2d\x5348"
+    [ regex "中午"
     ]
   , prod = \_ -> tt $ hour False 12
   }
@@ -407,16 +345,16 @@
 ruleToday = Rule
   { name = "today"
   , pattern =
-    [ regex "\x4eca\x5929|\x4eca\x65e5"
+    [ regex "今天|今日"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 0
   }
 
-ruleThisnextDayofweek :: Rule
-ruleThisnextDayofweek = Rule
-  { name = "this|next <day-of-week>"
+ruleNextDayofweek :: Rule
+ruleNextDayofweek = Rule
+  { name = "next <day-of-week>"
   , pattern =
-    [ regex "\x4eca(\x4e2a|\x500b)?|\x660e|\x4e0b(\x4e2a|\x500b)?"
+    [ regex "明|下(个|個)?"
     , Predicate isADayOfWeek
     ]
   , prod = \tokens -> case tokens of
@@ -429,7 +367,7 @@
 ruleTheDayBeforeYesterday = Rule
   { name = "the day before yesterday"
   , pattern =
-    [ regex "\x524d\x5929|\x524d\x65e5"
+    [ regex "前天|前日"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 2
   }
@@ -438,7 +376,7 @@
 ruleLaborDay = Rule
   { name = "labor day"
   , pattern =
-    [ regex "\x52b3\x52a8\x8282|\x52de\x52d5\x7bc0"
+    [ regex "劳动节|勞動節"
     ]
   , prod = \_ -> tt $ monthDay 5 1
   }
@@ -447,7 +385,7 @@
 ruleNextCycle = Rule
   { name = "next <cycle>"
   , pattern =
-    [ regex "\x4e0b(\x4e2a|\x500b)?"
+    [ regex "下(个|個)?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -456,30 +394,12 @@
       _ -> Nothing
   }
 
-ruleNamedmonth :: Rule
-ruleNamedmonth = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x4e00\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 1
-  }
-
-ruleNamedmonth3 :: Rule
-ruleNamedmonth3 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x4e09\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 3
-  }
-
 ruleDurationFromNow :: Rule
 ruleDurationFromNow = Rule
   { name = "<duration> from now"
   , pattern =
     [ dimension Duration
-    , regex "\x540e|\x5f8c|\x4e4b\x5f8c"
+    , regex "后|後|之後"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -491,7 +411,7 @@
 ruleLastCycle = Rule
   { name = "last <cycle>"
   , pattern =
-    [ regex "\x4e0a(\x4e2a|\x500b)?"
+    [ regex "上(个|個)?"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -504,7 +424,7 @@
 ruleAfternoon = Rule
   { name = "afternoon"
   , pattern =
-    [ regex "\x4e0b\x5348|\x4e2d\x5348|\x664f\x665d"
+    [ regex "下午|中午|\x664f\x665d"
     ]
   , prod = \_ ->
       let from = hour False 12
@@ -513,20 +433,11 @@
            interval TTime.Open from to
   }
 
-ruleNamedmonth4 :: Rule
-ruleNamedmonth4 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x56db\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 4
-  }
-
 ruleMidnight :: Rule
 ruleMidnight = Rule
   { name = "midnight"
   , pattern =
-    [ regex "\x5348\x591c|\x51cc\x6668|\x534a\x591c"
+    [ regex "午夜|凌晨|半夜"
     ]
   , prod = \_ -> tt $ hour False 0
   }
@@ -536,7 +447,7 @@
   { name = "in|during the <part-of-day>"
   , pattern =
     [ Predicate isAPartOfDay
-    , regex "\x70b9|\x9ede"
+    , regex "点|點"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -544,15 +455,6 @@
       _ -> Nothing
   }
 
-ruleNamedday5 :: Rule
-ruleNamedday5 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "\x661f\x671f\x4e94|\x5468\x4e94|\x793c\x62dc\x4e94|\x79ae\x62dc\x4e94|\x9031\x4e94"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 5
-  }
-
 ruleIntersectBy :: Rule
 ruleIntersectBy = Rule
   { name = "intersect by \",\""
@@ -581,15 +483,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth2 :: Rule
-ruleNamedmonth2 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x4e8c\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 2
-  }
-
 ruleIntegerLatentTimeofday :: Rule
 ruleIntegerLatentTimeofday = Rule
   { name = "<integer> (latent time-of-day)"
@@ -608,7 +501,7 @@
   { name = "year (numeric with year symbol)"
   , pattern =
     [ Predicate $ isIntegerBetween 1000 9999
-    , regex "\x5e74"
+    , regex "年"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -622,7 +515,7 @@
   { name = "<duration> ago"
   , pattern =
     [ dimension Duration
-    , regex "(\x4e4b)?\x524d"
+    , regex "(之)?前"
     ]
   , prod = \tokens -> case tokens of
       (Token Duration dd:_) ->
@@ -648,7 +541,7 @@
 ruleLastNCycle = Rule
   { name = "last n <cycle>"
   , pattern =
-    [ regex "\x4e0a|\x524d"
+    [ regex "上|前"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -665,7 +558,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
-    , regex "(\x4e4b)?\x524d"
+    , regex "(之)?前"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -687,15 +580,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth6 :: Rule
-ruleNamedmonth6 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x516d\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 6
-  }
-
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -710,32 +594,20 @@
       _ -> Nothing
   }
 
-ruleNamedmonth8 :: Rule
-ruleNamedmonth8 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x516b\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 8
-  }
-
 ruleWeekend :: Rule
 ruleWeekend = Rule
   { name = "week-end"
   , pattern =
-    [ regex "\x5468\x672b|\x9031\x672b"
+    [ regex "周末|週末"
     ]
-  , prod = \_ -> do
-      from <- intersect (dayOfWeek 5) (hour False 18)
-      to <- intersect (dayOfWeek 1) (hour False 0)
-      Token Time <$> interval TTime.Open from to
+  , prod = \_ -> tt weekend
   }
 
 ruleLastYear :: Rule
 ruleLastYear = Rule
   { name = "last year"
   , pattern =
-    [ regex "\x53bb\x5e74|\x4e0a\x5e74"
+    [ regex "去年|上年"
     ]
   , prod = \_ -> tt . cycleNth TG.Year $ - 1
   }
@@ -757,7 +629,7 @@
 ruleNextTime = Rule
   { name = "next <time>"
   , pattern =
-    [ regex "\x660e|\x4e0b(\x4e2a|\x500b)?"
+    [ regex "明|下(个|個)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -785,7 +657,7 @@
 ruleNextNCycle = Rule
   { name = "next n <cycle>"
   , pattern =
-    [ regex "\x4e0b|\x540e|\x5f8c"
+    [ regex "下|后|後"
     , Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
     ]
@@ -802,7 +674,7 @@
   , pattern =
     [ Predicate $ isIntegerBetween 1 9999
     , dimension TimeGrain
-    , regex "\x4e0b|(\x4e4b)?\x540e|(\x4e4b)?\x5f8c"
+    , regex "下|(之)?后|(之)?後"
     ]
   , prod = \tokens -> case tokens of
       (token:Token TimeGrain grain:_) -> do
@@ -815,7 +687,7 @@
 ruleMorning = Rule
   { name = "morning"
   , pattern =
-    [ regex "\x65e9\x4e0a|\x65e9\x6668|\x671d(\x982d)?\x65e9"
+    [ regex "早上|早晨|\x671d(\x982d)?早"
     ]
   , prod = \_ ->
       let from = hour False 4
@@ -828,7 +700,7 @@
 ruleNextYear = Rule
   { name = "next year"
   , pattern =
-    [ regex "\x660e\x5e74|\x4e0b\x5e74"
+    [ regex "明年|下年"
     ]
   , prod = \_ -> tt $ cycleNth TG.Year 1
   }
@@ -837,7 +709,7 @@
 ruleThisCycle = Rule
   { name = "this <cycle>"
   , pattern =
-    [ regex "(\x8fd9|\x9019)(\x4e00)?|\x4eca\x500b"
+    [ regex "(这|這)(一)?|今個"
     , dimension TimeGrain
     ]
   , prod = \tokens -> case tokens of
@@ -850,7 +722,7 @@
 ruleThisTime = Rule
   { name = "this <time>"
   , pattern =
-    [ regex "\x4eca(\x4e2a|\x500b)?|\x8fd9(\x4e2a)?|\x9019(\x500b)?"
+    [ regex "今(个|個)?|这(个)?|這(個)?"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -863,7 +735,7 @@
 ruleYesterday = Rule
   { name = "yesterday"
   , pattern =
-    [ regex "\x6628\x5929|\x6628\x65e5|\x5c0b\x65e5"
+    [ regex "昨天|昨日|\x5c0b日"
     ]
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
@@ -872,7 +744,7 @@
 ruleChristmas = Rule
   { name = "christmas"
   , pattern =
-    [ regex "(\x5723\x8bde|\x8056\x8a95)(\x8282|\x7bc0)?"
+    [ regex "(圣诞|聖誕)(节|節)?"
     ]
   , prod = \_ -> tt $ monthDay 12 25
   }
@@ -881,7 +753,7 @@
 ruleLastNight = Rule
   { name = "last night"
   , pattern =
-    [ regex "\x6628\x665a|\x6628\x5929\x665a\x4e0a|\x5c0b\x665a"
+    [ regex "昨晚|昨天晚上|\x5c0b晚"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day $ - 1
@@ -906,7 +778,7 @@
 ruleArmysDay = Rule
   { name = "army's day"
   , pattern =
-    [ regex "\x5efa(\x519b\x8282|\x8ecd\x7bc0)"
+    [ regex "建(军节|軍節)"
     ]
   , prod = \_ -> tt $ monthDay 8 1
   }
@@ -917,7 +789,7 @@
   , pattern =
     [ Predicate isAMonth
     , dimension Numeral
-    , regex "\x53f7|\x865f|\x65e5"
+    , regex "号|號|日"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:token:_) -> Token Time <$> intersectDOM td token
@@ -928,7 +800,7 @@
 ruleLastTuesdayLastJuly = Rule
   { name = "last tuesday, last july"
   , pattern =
-    [ regex "\x4e0a"
+    [ regex "上"
     , dimension Time
     ]
   , prod = \tokens -> case tokens of
@@ -937,24 +809,6 @@
       _ -> Nothing
   }
 
-ruleNamedmonth5 :: Rule
-ruleNamedmonth5 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x4e94\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 5
-  }
-
-ruleNamedday7 :: Rule
-ruleNamedday7 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "\x661f\x671f\x65e5|\x661f\x671f\x5929|\x793c\x62dc\x5929|\x5468\x65e5|\x79ae\x62dc\x5929|\x9031\x65e5|\x79ae\x62dc\x65e5"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 7
-  }
-
 rulePartofdayDimTime :: Rule
 rulePartofdayDimTime = Rule
   { name = "<part-of-day> <dim time>"
@@ -973,7 +827,7 @@
   { name = "month (numeric with month symbol)"
   , pattern =
     [ Predicate $ isIntegerBetween 1 12
-    , regex "\x6708"
+    , regex "月"
     ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
@@ -986,7 +840,7 @@
 ruleTonight = Rule
   { name = "tonight"
   , pattern =
-    [ regex "\x4eca\x665a|\x4eca\x5929\x665a\x4e0a"
+    [ regex "今晚|今天晚上"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day 0
@@ -998,7 +852,7 @@
 ruleTomorrowNight = Rule
   { name = "tomorrow night"
   , pattern =
-    [ regex "\x660e\x665a|\x660e\x5929\x665a\x4e0a|\x807d\x665a"
+    [ regex "明晚|明天晚上|\x807d晚"
     ]
   , prod = \_ -> do
       let td1 = cycleNth TG.Day 1
@@ -1006,20 +860,11 @@
       Token Time . partOfDay <$> intersect td1 td2
   }
 
-ruleNamedmonth10 :: Rule
-ruleNamedmonth10 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x5341\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 10
-  }
-
 ruleChildrensDay :: Rule
 ruleChildrensDay = Rule
   { name = "children's day"
   , pattern =
-    [ regex "(\x513f|\x5152)\x7ae5(\x8282|\x7bc0)"
+    [ regex "(儿|兒)童(节|節)"
     ]
   , prod = \_ -> tt $ monthDay 6 1
   }
@@ -1028,7 +873,7 @@
 ruleThisYear = Rule
   { name = "this year"
   , pattern =
-    [ regex "\x4eca\x5e74"
+    [ regex "今年"
     ]
   , prod = \_ -> tt $ cycleNth TG.Year 0
   }
@@ -1045,20 +890,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth11 :: Rule
-ruleNamedmonth11 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x5341\x4e00\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 11
-  }
-
 ruleWomensDay :: Rule
 ruleWomensDay = Rule
   { name = "women's day"
   , pattern =
-    [ regex "(\x5987|\x5a66)\x5973(\x8282|\x7bc0)"
+    [ regex "(妇|婦)女(节|節)"
     ]
   , prod = \_ -> tt $ monthDay 3 8
   }
@@ -1067,7 +903,7 @@
 ruleEveningnight = Rule
   { name = "evening|night"
   , pattern =
-    [ regex "\x665a\x4e0a|\x665a\x95f4"
+    [ regex "晚上|晚间"
     ]
   , prod = \_ ->
       let from = hour False 18
@@ -1076,15 +912,6 @@
            interval TTime.Open from to
   }
 
-ruleNamedday3 :: Rule
-ruleNamedday3 = Rule
-  { name = "named-day"
-  , pattern =
-    [ regex "\x661f\x671f\x4e09|\x5468\x4e09|\x793c\x62dc\x4e09|\x79ae\x62dc\x4e09|\x9031\x4e09"
-    ]
-  , prod = \_ -> tt $ dayOfWeek 3
-  }
-
 ruleMmddyyyy :: Rule
 ruleMmddyyyy = Rule
   { name = "mm/dd/yyyy"
@@ -1104,7 +931,7 @@
 ruleTomorrow = Rule
   { name = "tomorrow"
   , pattern =
-    [ regex "\x660e\x5929|\x660e\x65e5|\x807d\x65e5"
+    [ regex "明天|明日|\x807d日"
     ]
   , prod = \_ -> tt $ cycleNth TG.Day 1
   }
@@ -1114,7 +941,7 @@
   { name = "<time-of-day> o'clock"
   , pattern =
     [ Predicate isATimeOfDay
-    , regex "\x9ede|\x70b9|\x6642"
+    , regex "點|点|時"
     ]
   , prod = \tokens -> case tokens of
       (Token Time td:_) ->
@@ -1122,20 +949,11 @@
       _ -> Nothing
   }
 
-ruleNamedmonth9 :: Rule
-ruleNamedmonth9 = Rule
-  { name = "named-month"
-  , pattern =
-    [ regex "\x4e5d\x6708(\x4efd)?"
-    ]
-  , prod = \_ -> tt $ month 9
-  }
-
 ruleTimezone :: Rule
 ruleTimezone = Rule
   { name = "<time> timezone"
   , pattern =
-    [ Predicate $ liftM2 (&&) isATimeOfDay isNotLatent
+    [ Predicate $ and . sequence [isNotLatent, isATimeOfDay]
     , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b"
     ]
   , prod = \tokens -> case tokens of
@@ -1145,6 +963,52 @@
       _ -> Nothing
   }
 
+
+daysOfWeek :: [(Text, String)]
+daysOfWeek =
+  [ ( "Monday", "星期一|周一|礼拜一|禮拜一|週一" )
+  , ( "Tuesday", "星期二|周二|礼拜二|禮拜二|週二" )
+  , ( "Wednesday", "星期三|周三|礼拜三|禮拜三|週三" )
+  , ( "Thursday", "星期四|周四|礼拜四|禮拜四|週四" )
+  , ( "Friday", "星期五|周五|礼拜五|禮拜五|週五" )
+  , ( "Saturday", "星期六|周六|礼拜六|禮拜六|週六" )
+  , ( "Sunday", "星期日|星期天|礼拜天|周日|禮拜天|週日|禮拜日" )
+  ]
+
+ruleDaysOfWeek :: [Rule]
+ruleDaysOfWeek = zipWith go daysOfWeek [1..7]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ dayOfWeek i
+      }
+
+months :: [(Text, String)]
+months =
+  [ ( "January", "一月(份)?" )
+  , ( "February", "二月(份)?" )
+  , ( "March", "三月(份)?" )
+  , ( "April", "四月(份)?" )
+  , ( "May", "五月(份)?" )
+  , ( "June", "六月(份)?" )
+  , ( "July", "七月(份)?" )
+  , ( "August", "八月(份)?" )
+  , ( "September", "九月(份)?" )
+  , ( "October", "十月(份)?" )
+  , ( "November", "十一月(份)?" )
+  , ( "December", "十二月(份)?" )
+  ]
+
+ruleMonths :: [Rule]
+ruleMonths = zipWith go months [1..12]
+  where
+    go (name, regexPattern) i = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> tt $ month i
+      }
+
 rules :: [Rule]
 rules =
   [ ruleAbsorptionOfAfterNamedDay
@@ -1176,27 +1040,7 @@
   , ruleMmddyyyy
   , ruleMonthNumericWithMonthSymbol
   , ruleMorning
-  , ruleNamedday
-  , ruleNamedday2
-  , ruleNamedday3
-  , ruleNamedday4
-  , ruleNamedday5
-  , ruleNamedday6
-  , ruleNamedday7
-  , ruleNamedmonth
-  , ruleNamedmonth10
-  , ruleNamedmonth11
-  , ruleNamedmonth12
-  , ruleNamedmonth2
-  , ruleNamedmonth3
-  , ruleNamedmonth4
-  , ruleNamedmonth5
-  , ruleNamedmonth6
-  , ruleNamedmonth7
-  , ruleNamedmonth8
-  , ruleNamedmonth9
   , ruleNamedmonthDayofmonth
-  , ruleNationalDay
   , ruleNewYearsDay
   , ruleNextCycle
   , ruleNextNCycle
@@ -1228,7 +1072,7 @@
   , ruleThisDayofweek
   , ruleThisTime
   , ruleThisYear
-  , ruleThisnextDayofweek
+  , ruleNextDayofweek
   , ruleTimeofdayAmpm
   , ruleTimeofdayOclock
   , ruleToday
@@ -1243,3 +1087,5 @@
   , ruleYyyymmdd
   , ruleTimezone
   ]
+  ++ ruleDaysOfWeek
+  ++ ruleMonths
diff --git a/Duckling/Time/ZH/TW/Corpus.hs b/Duckling/Time/ZH/TW/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/TW/Corpus.hs
@@ -0,0 +1,37 @@
+-- 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.Time.ZH.TW.Corpus
+  ( allExamples
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Testing.Types hiding (examples)
+import Duckling.Time.Corpus
+import Duckling.Time.Types hiding (Month)
+import Duckling.TimeGrain.Types hiding (add)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (datetime (2013, 10, 10, 0, 0, 0) Day)
+             [ "国庆"
+             , "國慶"
+             , "国庆节"
+             , "国庆節"
+             , "國慶节"
+             , "國慶節"
+             ]
+  , examples (datetimeInterval ((2013, 10, 10, 18, 0, 0), (2013, 10, 11, 0, 0, 0)) Hour)
+             [ "国庆节晚上"
+             , "國慶節晚上"
+             ]
+  ]
diff --git a/Duckling/Time/ZH/TW/Rules.hs b/Duckling/Time/ZH/TW/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/ZH/TW/Rules.hs
@@ -0,0 +1,35 @@
+-- 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.Time.ZH.TW.Rules
+  ( rules
+  ) where
+
+import Prelude
+
+import Duckling.Regex.Types
+import Duckling.Time.Helpers
+import Duckling.Types
+
+ruleNationalDay :: Rule
+ruleNationalDay = Rule
+  { name = "national day"
+  , pattern =
+    [ regex "(国庆|國慶)(节|節)?"
+    ]
+  , prod = \_ -> tt $ monthDay 10 10
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleNationalDay
+  ]
diff --git a/Duckling/TimeGrain/DA/Rules.hs b/Duckling/TimeGrain/DA/Rules.hs
--- a/Duckling/TimeGrain/DA/Rules.hs
+++ b/Duckling/TimeGrain/DA/Rules.hs
@@ -26,9 +26,9 @@
          , ("hour (grain)", "t(imer?)?", TG.Hour)
          , ("day (grain)", "dag(e)?", TG.Day)
          , ("week (grain)", "uger?", TG.Week)
-         , ("month (grain)", "m\x00e5ned(er)?", TG.Month)
+         , ("month (grain)", "måned(er)?", TG.Month)
          , ("quarter (grain)", "kvartal(er)?", TG.Quarter)
-         , ("year (grain)", "\x00e5r", TG.Year)
+         , ("year (grain)", "år", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/ES/Rules.hs b/Duckling/TimeGrain/ES/Rules.hs
--- a/Duckling/TimeGrain/ES/Rules.hs
+++ b/Duckling/TimeGrain/ES/Rules.hs
@@ -24,11 +24,11 @@
 grains = [ ("segundo (grain)", "seg(undo)?s?", TG.Second)
          , ("minutos (grain)", "min(uto)?s?", TG.Minute)
          , ("hora (grain)", "h(ora)?s?", TG.Hour)
-         , ("dia (grain)", "d(\x00ed|i)as?", TG.Day)
+         , ("dia (grain)", "d(í|i)as?", TG.Day)
          , ("semana (grain)", "semanas?", TG.Week)
          , ("mes (grain)", "mes(es)?", TG.Month)
          , ("trimestre (grain)", "trimestres?", TG.Quarter)
-         , ("año (grain)", "a(n|\x00f1)os?", TG.Year)
+         , ("año (grain)", "a(n|ñ)os?", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/FR/Rules.hs b/Duckling/TimeGrain/FR/Rules.hs
--- a/Duckling/TimeGrain/FR/Rules.hs
+++ b/Duckling/TimeGrain/FR/Rules.hs
@@ -23,11 +23,11 @@
 grains = [ ("seconde (grain)", "sec(onde)?s?", TG.Second)
          , ("minute (grain)", "min(ute)?s?", TG.Minute)
          , ("heure (grain)", "heures?", TG.Hour)
-         , ("jour (grain)", "jour(n(e|\x00e9)e?)?s?", TG.Day)
+         , ("jour (grain)", "jour(n(e|é)e?)?s?", TG.Day)
          , ("semaine (grain)", "semaines?", TG.Week)
          , ("mois (grain)", "mois", TG.Month)
          , ("trimestre (grain)", "trimestres?", TG.Quarter)
-         , ("année (grain)", "an(n(e|\x00e9)e?)?s?", TG.Year)
+         , ("année (grain)", "an(n(e|é)e?)?s?", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/GA/Rules.hs b/Duckling/TimeGrain/GA/Rules.hs
--- a/Duckling/TimeGrain/GA/Rules.hs
+++ b/Duckling/TimeGrain/GA/Rules.hs
@@ -21,13 +21,13 @@
 import Duckling.Types
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("soicind (grain)", "t?sh?oicind(\x00ed|i)?", TG.Second)
-         , ("nóiméad (grain)", "n[\x00f3o]im(\x00e9|e)[ai]da?", TG.Minute)
+grains = [ ("soicind (grain)", "t?sh?oicind(í|i)?", TG.Second)
+         , ("nóiméad (grain)", "n[óo]im(é|e)[ai]da?", TG.Minute)
          , ("uair (grain)", "([thn]-?)?uair(e|eanta)?", TG.Hour)
-         , ("lá (grain)", "l(ae(thanta)?|(\x00e1|a))", TG.Day)
-         , ("seachtain (grain)", "t?sh?eachtain(e|(\x00ed|i))?", TG.Week)
-         , ("mí (grain)", "mh?(\x00ed|i)(sa|nna)", TG.Month)
-         , ("ráithe (grain)", "r(\x00e1|a)ith(e|(\x00ed|i))", TG.Quarter)
+         , ("lá (grain)", "l(ae(thanta)?|(á|a))", TG.Day)
+         , ("seachtain (grain)", "t?sh?eachtain(e|(í|i))?", TG.Week)
+         , ("mí (grain)", "mh?(í|i)(sa|nna)", TG.Month)
+         , ("ráithe (grain)", "r(á|a)ith(e|(í|i))", TG.Quarter)
          , ("bliain (grain)", "m?bh?lia(in|na|nta)", TG.Year)
          ]
 
diff --git a/Duckling/TimeGrain/HE/Rules.hs b/Duckling/TimeGrain/HE/Rules.hs
--- a/Duckling/TimeGrain/HE/Rules.hs
+++ b/Duckling/TimeGrain/HE/Rules.hs
@@ -20,14 +20,14 @@
 import qualified Duckling.TimeGrain.Types as TG
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("second (grain)", "\x05e9\x05e0\x05d9\x05d5\x05ea|\x05e9\x05e0\x05d9\x05d9\x05d4", TG.Second)
-         , ("minute (grain)", "\x05d3\x05e7\x05d4|\x05d3\x05e7\x05d5\x05ea", TG.Minute)
-         , ("hour (grain)", "\x05e9\x05e2\x05d5\x05ea|\x05e9\x05e2\x05d4", TG.Hour)
-         , ("day (grain)", "\x05d9\x05de\x05d9\x05dd|\x05d9\x05d5\x05dd", TG.Day)
-         , ("week (grain)", "\x05e9\x05d1\x05d5\x05e2|\x05e9\x05d1\x05d5\x05e2\x05d5\x05ea", TG.Week)
-         , ("month (grain)", "\x05d7\x05d5\x05d3\x05e9|\x05d7\x05d5\x05d3\x05e9\x05d9\x05dd", TG.Month)
-         , ("quarter (grain)", "\x05e8\x05d1\x05e2", TG.Quarter)
-         , ("year (grain)", "\x05e9\x05e0\x05d4", TG.Year)
+grains = [ ("second (grain)", "שניות|שנייה", TG.Second)
+         , ("minute (grain)", "דקה|דקות", TG.Minute)
+         , ("hour (grain)", "שעות|שעה", TG.Hour)
+         , ("day (grain)", "ימים|יום", TG.Day)
+         , ("week (grain)", "שבוע|שבועות", TG.Week)
+         , ("month (grain)", "חודש|חודשים", TG.Month)
+         , ("quarter (grain)", "רבע", TG.Quarter)
+         , ("year (grain)", "שנה", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/HR/Rules.hs b/Duckling/TimeGrain/HR/Rules.hs
--- a/Duckling/TimeGrain/HR/Rules.hs
+++ b/Duckling/TimeGrain/HR/Rules.hs
@@ -26,7 +26,7 @@
          , ("day (grain)", "dan(i|a|e)?", TG.Day)
          , ("week (grain)", "tjeda?n(a|e|u|i)?", TG.Week)
          , ("month (grain)", "mjesec(a|e|u|i)?", TG.Month)
-         , ("quarter (grain)", "kvartalu?|tromjese(c|\x010d)j(e|u)", TG.Quarter)
+         , ("quarter (grain)", "kvartalu?|tromjese(c|č)j(e|u)", TG.Quarter)
          , ("year (grain)", "godin(a|e|u)", TG.Year)
          ]
 
diff --git a/Duckling/TimeGrain/HU/Rules.hs b/Duckling/TimeGrain/HU/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/TimeGrain/HU/Rules.hs
@@ -0,0 +1,40 @@
+-- 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.HU.Rules
+  ( rules ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
+
+grains :: [(Text, String, TG.Grain)]
+grains = [ ("second (grain) ", "m\x00E1sodperc(ek)?|mp",    TG.Second)
+         , ("minute (grain)" , "perc(ek)?",                 TG.Minute)
+         , ("hour (grain)"   , "\x00F3ra|\x00F3r\x00E1k",   TG.Hour)
+         , ("day (grain)"    , "nap(ok)?",                  TG.Day)
+         , ("week (grain)"   , "h\x00E9t|hetek",            TG.Week)
+         , ("month (grain)"  , "h\x00F3nap|h\x00F3napok",   TG.Month)
+         , ("quarter (grain)", "negyed\\s?\x00E9v(ek)?",    TG.Quarter)
+         , ("year (grain)"   , "\x00E9v(ek)?",              TG.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/JA/Rules.hs b/Duckling/TimeGrain/JA/Rules.hs
--- a/Duckling/TimeGrain/JA/Rules.hs
+++ b/Duckling/TimeGrain/JA/Rules.hs
@@ -21,13 +21,13 @@
 import Duckling.Types
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("second (grain)", "\x79d2(\x6bce|\x9593)?", TG.Second)
-         , ("minute (grain)", "\x5206(\x6bce|\x9593)?", TG.Minute)
-         , ("hour (grain)", "\x6642(\x6bce|\x9593)?", TG.Hour)
-         , ("day (grain)", "\x65e5(\x6bce|\x9593)?", TG.Day)
-         , ("week (grain)", "\x9031(\x6bce|\x9593)?", TG.Week)
-         , ("month (grain)", "\x6708(\x6bce|\x9593)?", TG.Month)
-         , ("year (grain)", "\x5e74(\x6bce|\x9593)?", TG.Year)
+grains = [ ("second (grain)", "秒(毎|間)?", TG.Second)
+         , ("minute (grain)", "分(毎|間)?", TG.Minute)
+         , ("hour (grain)", "時(毎|間)?", TG.Hour)
+         , ("day (grain)", "日(毎|間)?", TG.Day)
+         , ("week (grain)", "週(毎|間)?", TG.Week)
+         , ("month (grain)", "月(毎|間)?", TG.Month)
+         , ("year (grain)", "年(毎|間)?", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/KO/Rules.hs b/Duckling/TimeGrain/KO/Rules.hs
--- a/Duckling/TimeGrain/KO/Rules.hs
+++ b/Duckling/TimeGrain/KO/Rules.hs
@@ -21,14 +21,14 @@
 import Duckling.Types
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("second (grain)", "\xcd08", TG.Second)
-         , ("minute (grain)", "\xbd84", TG.Minute)
-         , ("hour (grain)", "\xc2dc(\xac04)?", TG.Hour)
-         , ("day (grain)", "\xb0a0|\xc77c(\xac04|\xb3d9\xc548)?", TG.Day)
-         , ("week (grain)", "\xc8fc(\xac04|\xb3d9\xc548|\xc77c)?", TG.Week)
-         , ("month (grain)", "(\xb2ec)(\xac04|\xb3d9\xc548)?", TG.Month)
-         , ("quarter (grain)", "\xbd84\xae30(\xac04|\xb3d9\xc548)?", TG.Quarter)
-         , ("year (grain)", "\xd574|\xc5f0\xac04|\xb144(\xac04|\xb3d9\xc548)?", TG.Year)
+grains = [ ("second (grain)", "초", TG.Second)
+         , ("minute (grain)", "분", TG.Minute)
+         , ("hour (grain)", "시(간)?", TG.Hour)
+         , ("day (grain)", "날|일(간|동안)?", TG.Day)
+         , ("week (grain)", "주(간|동안|일)?", TG.Week)
+         , ("month (grain)", "(달)(간|동안)?", TG.Month)
+         , ("quarter (grain)", "분기(간|동안)?", TG.Quarter)
+         , ("year (grain)", "해|연간|년(간|동안)?", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/NB/Rules.hs b/Duckling/TimeGrain/NB/Rules.hs
--- a/Duckling/TimeGrain/NB/Rules.hs
+++ b/Duckling/TimeGrain/NB/Rules.hs
@@ -26,9 +26,9 @@
          , ("hour (grain)", "t(ime(r)?)?", TG.Hour)
          , ("day (grain)", "dag(er)?", TG.Day)
          , ("week (grain)", "uke(r|n)?", TG.Week)
-         , ("month (grain)", "m\x00e5ned(er)?", TG.Month)
+         , ("month (grain)", "måned(er)?", TG.Month)
          , ("quarter (grain)", "kvart(al|er)(et)?", TG.Quarter)
-         , ("year (grain)", "\x00e5r", TG.Year)
+         , ("year (grain)", "år", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/NL/Rules.hs b/Duckling/TimeGrain/NL/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/TimeGrain/NL/Rules.hs
@@ -0,0 +1,40 @@
+-- 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.NL.Rules
+  ( rules ) where
+
+import Data.Text (Text)
+import Data.String
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
+
+grains :: [(Text, String, TG.Grain)]
+grains = [ ("second (grain) " , "(seconde(n|s)?|sec|s)" , TG.Second)
+         , ("minute (grain)"  , "(minuut|minuten|min|m)", TG.Minute)
+         , ("hour (grain)"    , "(u|h|uur|uren)",         TG.Hour)
+         , ("day (grain)"     , "(dagen|dag|d)",          TG.Day)
+         , ("week (grain)"    , "(weken|week|w)",         TG.Week)
+         , ("month (grain)"   , "(maanden|maand|mnd)",    TG.Month)
+         , ("quarter (grain)" , "kwartier",               TG.Quarter)
+         , ("year (grain)"    , "(jaren|jaar|j)",         TG.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/PL/Rules.hs b/Duckling/TimeGrain/PL/Rules.hs
--- a/Duckling/TimeGrain/PL/Rules.hs
+++ b/Duckling/TimeGrain/PL/Rules.hs
@@ -21,13 +21,13 @@
 import Duckling.Types
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("second (grain)", "sekund(y|zie|(e|\x0119)|om|ami|ach|o|a)?|s", TG.Second)
-         , ("minute (grain)", "minut(y|cie|(e|\x0119)|om|o|ami|ach|(a|\x0105))?|m", TG.Minute)
-         , ("hour (grain)", "h|godzin(y|(e|\x0119)|ie|om|o|ami|ach|(a|\x0105))?", TG.Hour)
-         , ("day (grain)", "dzie(n|\x0144|ni(a|\x0105))|dni(owi|ach|a|\x0105)?", TG.Day)
-         , ("week (grain)", "tydzie(n|\x0144|)|tygod(ni(owi|u|a|em))|tygodn(iach|iami|iom|ie|i)|tyg\\.?", TG.Week)
-         , ("month (grain)", "miesi(a|\x0105)c(owi|em|u|e|om|ami|ach|a)?", TG.Month)
-         , ("quarter (grain)", "kwarta(l|\x0142)(u|owi|em|e|(o|\x00f3)w|om|ach|ami|y)?", TG.Quarter)
+grains = [ ("second (grain)", "sekund(y|zie|(e|ę)|om|ami|ach|o|a)?|s", TG.Second)
+         , ("minute (grain)", "minut(y|cie|(e|ę)|om|o|ami|ach|(a|ą))?|m", TG.Minute)
+         , ("hour (grain)", "h|godzin(y|(e|ę)|ie|om|o|ami|ach|(a|ą))?", TG.Hour)
+         , ("day (grain)", "dzie(n|ń|ni(a|ą))|dni(owi|ach|a|ą)?", TG.Day)
+         , ("week (grain)", "tydzie(n|ń|)|tygod(ni(owi|u|a|em))|tygodn(iach|iami|iom|ie|i)|tyg\\.?", TG.Week)
+         , ("month (grain)", "miesi(a|ą)c(owi|em|u|e|om|ami|ach|a)?", TG.Month)
+         , ("quarter (grain)", "kwarta(l|ł)(u|owi|em|e|(o|ó)w|om|ach|ami|y)?", TG.Quarter)
          , ("year (grain)", "rok(u|owi|iem)?|lat(ami|ach|a|om)?", TG.Year)
          ]
 
diff --git a/Duckling/TimeGrain/PT/Rules.hs b/Duckling/TimeGrain/PT/Rules.hs
--- a/Duckling/TimeGrain/PT/Rules.hs
+++ b/Duckling/TimeGrain/PT/Rules.hs
@@ -24,9 +24,9 @@
 grains = [ ("segundo (grain)", "seg(undo)?s?", TG.Second)
          , ("minutos (grain)", "min(uto)?s?", TG.Minute)
          , ("hora (grain)", "h(ora)?s?", TG.Hour)
-         , ("dia (grain)", "d(\x00ed|i)as?", TG.Day)
+         , ("dia (grain)", "d(í|i)as?", TG.Day)
          , ("semana (grain)", "semanas?", TG.Week)
-         , ("mes (grain)", "m(e|\x00ea)s(es)?", TG.Month)
+         , ("mes (grain)", "m(e|ê)s(es)?", TG.Month)
          , ("ano (grain)", "anos?", TG.Year)
          ]
 
diff --git a/Duckling/TimeGrain/RO/Rules.hs b/Duckling/TimeGrain/RO/Rules.hs
--- a/Duckling/TimeGrain/RO/Rules.hs
+++ b/Duckling/TimeGrain/RO/Rules.hs
@@ -21,12 +21,12 @@
 import Duckling.Types
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("secunde (grain)", "sec(und(a|e|\x0103))?", TG.Second)
+grains = [ ("secunde (grain)", "sec(und(a|e|ă))?", TG.Second)
          , ("minute (grain)", "min(ut(e|ul)?)?", TG.Minute)
-         , ("ore (grain)", "h|or(a|e(le)?|\x0103)", TG.Hour)
-         , ("zile (grain)", "zi(le(le)?|u(a|\x0103))?", TG.Day)
-         , ("saptamani (grain)", "sapt(a|\x0103)m(a|\x00e2)n(ile|a|\x0103|i)", TG.Week)
-         , ("luni (grain)", "lun(i(le)?|a|\x0103)", TG.Month)
+         , ("ore (grain)", "h|or(a|e(le)?|ă)", TG.Hour)
+         , ("zile (grain)", "zi(le(le)?|u(a|ă))?", TG.Day)
+         , ("saptamani (grain)", "sapt(a|ă)m(a|â)n(ile|a|ă|i)", TG.Week)
+         , ("luni (grain)", "lun(i(le)?|a|ă)", TG.Month)
          , ("trimestru (grain)", "trimestr(e(le)?|ul?)", TG.Quarter)
          , ("ani (grain)", "an(ul|ii?)?", TG.Year)
          ]
diff --git a/Duckling/TimeGrain/SV/Rules.hs b/Duckling/TimeGrain/SV/Rules.hs
--- a/Duckling/TimeGrain/SV/Rules.hs
+++ b/Duckling/TimeGrain/SV/Rules.hs
@@ -26,9 +26,9 @@
          , ("hour (grain)", "t(imm(e(n)?|ar(na)?)?)?", TG.Hour)
          , ("day (grain)", "dag(en|ar(na)?)?", TG.Day)
          , ("week (grain)", "veck(or(na)?|a(n)?)?", TG.Week)
-         , ("month (grain)", "m\x00e5nad(er(na)?)?", TG.Month)
+         , ("month (grain)", "månad(er(na)?)?", TG.Month)
          , ("quarter (grain)", "kvart(al)(et)?", TG.Quarter)
-         , ("year (grain)", "\x00e5r(en)?", TG.Year)
+         , ("year (grain)", "år(e[nt])?", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/TR/Rules.hs b/Duckling/TimeGrain/TR/Rules.hs
--- a/Duckling/TimeGrain/TR/Rules.hs
+++ b/Duckling/TimeGrain/TR/Rules.hs
@@ -24,7 +24,7 @@
 grains = [ ("saniye (grain)",     "sa?n(iye)?",           TG.Second)
          , ("dakika (grain)",     "da?k(ika)?",           TG.Minute)
          , ("saat (grain)",       "sa(at)?",              TG.Hour)
-         , ("gün (grain)",        "g\x00fcn",             TG.Day)
+         , ("gün (grain)",        "gün",             TG.Day)
          , ("hafta (grain)",      "hafta",                TG.Week)
          , ("ay (grain)",         "ay",                   TG.Month)
          , ("çeyrek yıl (grain)", "\231eyrek y\305l",     TG.Quarter)
diff --git a/Duckling/TimeGrain/Types.hs b/Duckling/TimeGrain/Types.hs
--- a/Duckling/TimeGrain/Types.hs
+++ b/Duckling/TimeGrain/Types.hs
@@ -15,23 +15,25 @@
   ( Grain(..)
   , add
   , inSeconds
+  , lower
   )
   where
 
 import Control.DeepSeq
 import Data.Aeson
 import Data.Hashable
-import qualified Data.Text as Text
 import Data.Text.Lazy.Builder (fromText)
-import qualified Data.Time as Time
 import GHC.Generics
-import TextShow
-
 import Prelude
+import TextShow
+import qualified Data.Text as Text
+import qualified Data.Time as Time
 
 import Duckling.Resolve (Resolve(..))
 
-data Grain = Second | Minute | Hour | Day | Week | Month | Quarter | Year
+data Grain
+  -- NoGrain is helpful to define "now"
+  = NoGrain | Second | Minute | Hour | Day | Week | Month | Quarter | Year
   deriving (Eq, Generic, Hashable, Ord, Bounded, Enum, Show, NFData)
 
 instance Resolve Grain where
@@ -48,6 +50,7 @@
 updateUTCDay (Time.UTCTime day diffTime) f = Time.UTCTime (f day) diffTime
 
 add :: Time.UTCTime -> Grain -> Integer -> Time.UTCTime
+add utcTime NoGrain n = Time.addUTCTime (realToFrac n) utcTime
 add utcTime Second n = Time.addUTCTime (realToFrac n) utcTime
 add utcTime Minute n = Time.addUTCTime (realToFrac $ 60 * n) utcTime
 add utcTime Hour n = Time.addUTCTime (realToFrac $ 3600 * n) utcTime
@@ -59,6 +62,7 @@
 add utcTime Year n = updateUTCDay utcTime $ Time.addGregorianYearsClip n
 
 inSeconds :: Grain -> Int -> Int
+inSeconds NoGrain n = n
 inSeconds Second  n = n
 inSeconds Minute  n = n * 60
 inSeconds Hour    n = n * inSeconds Minute 60
@@ -67,3 +71,10 @@
 inSeconds Month   n = n * inSeconds Day 30
 inSeconds Quarter n = n * inSeconds Month 3
 inSeconds Year    n = n * inSeconds Day 365
+
+lower :: Grain -> Grain
+lower NoGrain = Second
+lower Second = Second
+lower Year = Month
+lower Month = Day
+lower x = pred x
diff --git a/Duckling/TimeGrain/VI/Rules.hs b/Duckling/TimeGrain/VI/Rules.hs
--- a/Duckling/TimeGrain/VI/Rules.hs
+++ b/Duckling/TimeGrain/VI/Rules.hs
@@ -20,14 +20,14 @@
 import qualified Duckling.TimeGrain.Types as TG
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("second (grain)", "(gi\x00e2y|s|sec)", TG.Second)
-         , ("minute (grain)", "(ph\x00fat|m|min)", TG.Minute)
-         , ("hour (grain)", "(gi\x1edd|h|ti\x1ebfng)", TG.Hour)
-         , ("day (grain)", "ng\x00e0y", TG.Day)
-         , ("week (grain)", "tu\x1ea7n", TG.Week)
-         , ("month (grain)", "th\x00e1ng", TG.Month)
-         , ("quarter (grain)", "qu\x00fd", TG.Quarter)
-         , ("year (grain)", "n\x0103m", TG.Year)
+grains = [ ("second (grain)", "(giây|s|sec)", TG.Second)
+         , ("minute (grain)", "(phút|m|min)", TG.Minute)
+         , ("hour (grain)", "(giờ|h|tiếng)", TG.Hour)
+         , ("day (grain)", "ngày", TG.Day)
+         , ("week (grain)", "tuần", TG.Week)
+         , ("month (grain)", "tháng", TG.Month)
+         , ("quarter (grain)", "quý", TG.Quarter)
+         , ("year (grain)", "năm", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/ZH/Rules.hs b/Duckling/TimeGrain/ZH/Rules.hs
--- a/Duckling/TimeGrain/ZH/Rules.hs
+++ b/Duckling/TimeGrain/ZH/Rules.hs
@@ -21,15 +21,15 @@
 import Duckling.Types
 
 grains :: [(Text, String, TG.Grain)]
-grains = [ ("second (grain)", "\x79d2(\x949f|\x9418)?", TG.Second)
-         , ("minute (grain)", "\x5206(\x949f|\x9418)?", TG.Minute)
+grains = [ ("second (grain)", "秒(钟|鐘)?", TG.Second)
+         , ("minute (grain)", "分(钟|鐘)?", TG.Minute)
          , ("hour (grain)",
-             "\x5c0f\x65f6|\x5c0f\x6642|\x9418(\x982d)?", TG.Hour)
-         , ("day (grain)", "\x5929|\x65e5", TG.Day)
+             "小时|小時|鐘(\x982d)?", TG.Hour)
+         , ("day (grain)", "天|日", TG.Day)
          , ("week (grain)",
-             "\x5468|\x9031|\x793c\x62dc|\x79ae\x62dc|\x661f\x671f", TG.Week)
-         , ("month (grain)", "\x6708", TG.Month)
-         , ("year (grain)", "\x5e74", TG.Year)
+             "周|週|礼拜|禮拜|星期", TG.Week)
+         , ("month (grain)", "月", TG.Month)
+         , ("year (grain)", "年", TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/Types.hs b/Duckling/Types.hs
--- a/Duckling/Types.hs
+++ b/Duckling/Types.hs
@@ -146,7 +146,7 @@
 regex :: String -> PatternItem
 regex = Regex . R.makeRegexOpts compOpts execOpts
   where
-    compOpts = PCRE.defaultCompOpt + PCRE.compCaseless
+    compOpts = PCRE.defaultCompOpt + PCRE.compCaseless + PCRE.compUTF8
     execOpts = PCRE.defaultExecOpt
 
 dimension :: Typeable a => Dimension a -> PatternItem
diff --git a/Duckling/Types/Document.hs b/Duckling/Types/Document.hs
--- a/Duckling/Types/Document.hs
+++ b/Duckling/Types/Document.hs
@@ -19,19 +19,19 @@
   , isRangeValid
   ) where
 
-import qualified Data.Array.Unboxed as Array
 import Data.Array.Unboxed (UArray)
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as BS
-import qualified Data.Char as Char
 import Data.List (scanl', foldl', foldr)
 import Data.String
 import Data.Text (Text)
+import Prelude hiding (length)
+import qualified Data.Array.Unboxed as Array
+import qualified Data.ByteString as BS
+import qualified Data.Char as Char
 import qualified Data.Text.Unsafe as UText
 import qualified Data.Text.Encoding as Text
 import qualified Data.Text as Text
 import qualified Data.Text.Internal.Unsafe.Char as UText
-import Prelude hiding (length)
 
 
 data Document = Document
@@ -124,8 +124,7 @@
   where
     charClass :: Char -> Char
     charClass c
-      | Char.isLower c = 'l'
-      | Char.isUpper c = 'u'
+      | Char.isLower c || Char.isUpper c = 'c'
       | Char.isDigit c = 'd'
       | otherwise = c
     isDifferent :: Char -> Char -> Bool
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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = ES}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/ES/Rules.hs b/Duckling/Volume/ES/Rules.hs
--- a/Duckling/Volume/ES/Rules.hs
+++ b/Duckling/Volume/ES/Rules.hs
@@ -73,7 +73,7 @@
   { name = "<latent vol> gallon"
   , pattern =
     [ dimension Volume
-    , regex "gal(o|\x00f3)ne?s?"
+    , regex "gal(o|ó)ne?s?"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = FR}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, 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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = GA}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/GA/Rules.hs b/Duckling/Volume/GA/Rules.hs
--- a/Duckling/Volume/GA/Rules.hs
+++ b/Duckling/Volume/GA/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent vol> ml"
   , pattern =
     [ dimension Volume
-    , regex "m(l\\.?|h?illil(\x00ed|i)t(ea|i)r)"
+    , regex "m(l\\.?|h?illil(í|i)t(ea|i)r)"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
@@ -38,7 +38,7 @@
   { name = "<latent vol> kl"
   , pattern =
     [ dimension Volume
-    , regex "(kl\\.?|g?ch?illil(\x00ed|i)t(ea|i)r)"
+    , regex "(kl\\.?|g?ch?illil(í|i)t(ea|i)r)"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
@@ -51,7 +51,7 @@
   { name = "<vol> heictilítir"
   , pattern =
     [ dimension Volume
-    , regex "heictil(\x00ed|i)t(ea|i)r"
+    , regex "heictil(í|i)t(ea|i)r"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
@@ -64,7 +64,7 @@
   { name = "<vol> lítear"
   , pattern =
     [ dimension Volume
-    , regex "(l(\x00ed|i)t(ea|i)r|l\\.?)"
+    , regex "(l(í|i)t(ea|i)r|l\\.?)"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
@@ -77,7 +77,7 @@
   { name = "<latent vol> galún"
   , pattern =
     [ dimension Volume
-    , regex "n?gh?al(\x00fa|u)i?n"
+    , regex "n?gh?al(ú|u)i?n"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
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
@@ -13,13 +13,13 @@
 import Prelude
 import Data.String
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.Volume.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = HR}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, 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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = IT}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, 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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = KO}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/KO/Rules.hs b/Duckling/Volume/KO/Rules.hs
--- a/Duckling/Volume/KO/Rules.hs
+++ b/Duckling/Volume/KO/Rules.hs
@@ -25,7 +25,7 @@
   { name = "<latent vol> ml"
   , pattern =
     [ dimension Volume
-    , regex "ml|(\xbc00|\xbbf8)\xb9ac\xb9ac\xd130"
+    , regex "ml|(밀|미)리리터"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
@@ -38,7 +38,7 @@
   { name = "<vol> hectoliters"
   , pattern =
     [ dimension Volume
-    , regex "(\xd575|\xd5e5)\xd1a0\xb9ac\xd130"
+    , regex "(핵|헥)토리터"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
@@ -51,7 +51,7 @@
   { name = "<vol> liters"
   , pattern =
     [ dimension Volume
-    , regex "l|\xb9ac\xd130"
+    , regex "l|리터"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
@@ -64,7 +64,7 @@
   { name = "<latent vol> gallon"
   , pattern =
     [ dimension Volume
-    , regex "gal(l?ons?)?|\xac24(\xb7f0|\xb860)"
+    , regex "gal(l?ons?)?|갤(런|론)"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = NL}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, 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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = PT}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/PT/Rules.hs b/Duckling/Volume/PT/Rules.hs
--- a/Duckling/Volume/PT/Rules.hs
+++ b/Duckling/Volume/PT/Rules.hs
@@ -73,7 +73,7 @@
   { name = "<latent vol> gallon"
   , pattern =
     [ dimension Volume
-    , regex "gal(a|\x00e3|o|\x00f5)o?e?s?"
+    , regex "gal(a|ã|o|õ)o?e?s?"
     ]
   , prod = \tokens -> case tokens of
       (Token Volume vd:_) ->
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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Volume.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = RO}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/RO/Rules.hs b/Duckling/Volume/RO/Rules.hs
--- a/Duckling/Volume/RO/Rules.hs
+++ b/Duckling/Volume/RO/Rules.hs
@@ -63,7 +63,7 @@
 ruleHalfLiter = Rule
   { name = "half liter"
   , pattern =
-    [ regex "jum(a|\x0103)tate de litr[ui]"
+    [ regex "jum(a|ă)tate de litr[ui]"
     ]
   , prod = \_ -> Just . Token Volume . withUnit TVolume.Litre $ volume 0.5
   }
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
@@ -14,13 +14,13 @@
 import Data.String
 import Prelude
 
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.Volume.Types
 
 corpus :: Corpus
-corpus = (testContext {lang = TR}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@
 
 This runs a basic HTTP server. Example request:
 ```
-$ curl -XPOST http://0.0.0.0:8000/parse --data 'text=tomorrow at eight'
+$ curl -XPOST http://0.0.0.0:8000/parse --data 'locale=en_GB&text=tomorrow at eight'
 ```
 
 See `exe/ExampleMain.hs` for an example on how to integrate Duckling in your
@@ -69,6 +69,11 @@
 * `Duckling/<dimension>/<language>/Rules.hs`
 * `Duckling/<dimension>/<language>/Corpus.hs`
 
+To add a new language:
+* Make sure that the language code used follows the [ISO-639-1 standard](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes).
+* The first dimension to implement is `Numeral`.
+* Follow [this example](https://github.com/facebookincubator/duckling/commit/24d3f199768be970149412c95b1c1bf5d76f8240).
+
 Rules have a name, a pattern and a production.
 Patterns are used to perform character-level matching (regexes on input) and
 concept-level matching (predicates on tokens).
@@ -83,7 +88,7 @@
 ```
 $ stack repl --no-load
 > :l Duckling.Debug
-> debug EN "in two minutes" [This Time]
+> debug (makeLocale EN $ Just US) "in two minutes" [This Time]
 in|within|after <duration> (in two minutes)
 -- regex (in)
 -- <integer> <unit-of-duration> (two minutes)
diff --git a/duckling.cabal b/duckling.cabal
--- a/duckling.cabal
+++ b/duckling.cabal
@@ -1,5 +1,5 @@
 name:                duckling
-version:             0.1.2.0
+version:             0.1.3.0
 synopsis:            A Haskell library for parsing text into structured data.
 description:
   Duckling is a library for parsing text into structured data.
@@ -30,7 +30,7 @@
                      , Duckling.Api
                      , Duckling.Engine
                      , Duckling.Engine.Regex
-                     , Duckling.Lang
+                     , Duckling.Locale
                      , Duckling.Resolve
                      , Duckling.Types
                      , Duckling.Types.Document
@@ -41,6 +41,7 @@
                      , Duckling.Rules
                      , Duckling.Rules.Common
                      , Duckling.Rules.AR
+                     , Duckling.Rules.BG
                      , Duckling.Rules.CS
                      , Duckling.Rules.DA
                      , Duckling.Rules.DE
@@ -51,9 +52,11 @@
                      , Duckling.Rules.GA
                      , Duckling.Rules.HE
                      , Duckling.Rules.HR
+                     , Duckling.Rules.HU
                      , Duckling.Rules.ID
                      , Duckling.Rules.IT
                      , Duckling.Rules.JA
+                     , Duckling.Rules.KA
                      , Duckling.Rules.KO
                      , Duckling.Rules.MY
                      , Duckling.Rules.NB
@@ -74,33 +77,43 @@
                      , Duckling.Ranking.Extraction
                      , Duckling.Ranking.Rank
                      , Duckling.Ranking.Classifiers
-                     , Duckling.Ranking.Classifiers.AR
-                     , Duckling.Ranking.Classifiers.CS
-                     , Duckling.Ranking.Classifiers.DA
-                     , Duckling.Ranking.Classifiers.DE
-                     , Duckling.Ranking.Classifiers.EN
-                     , Duckling.Ranking.Classifiers.ES
-                     , Duckling.Ranking.Classifiers.ET
-                     , Duckling.Ranking.Classifiers.FR
-                     , Duckling.Ranking.Classifiers.GA
-                     , Duckling.Ranking.Classifiers.HE
-                     , Duckling.Ranking.Classifiers.HR
-                     , Duckling.Ranking.Classifiers.ID
-                     , Duckling.Ranking.Classifiers.IT
-                     , Duckling.Ranking.Classifiers.JA
-                     , Duckling.Ranking.Classifiers.KO
-                     , Duckling.Ranking.Classifiers.MY
-                     , Duckling.Ranking.Classifiers.NB
-                     , Duckling.Ranking.Classifiers.NL
-                     , Duckling.Ranking.Classifiers.PL
-                     , Duckling.Ranking.Classifiers.PT
-                     , Duckling.Ranking.Classifiers.RO
-                     , Duckling.Ranking.Classifiers.RU
-                     , Duckling.Ranking.Classifiers.SV
-                     , Duckling.Ranking.Classifiers.TR
-                     , Duckling.Ranking.Classifiers.UK
-                     , Duckling.Ranking.Classifiers.VI
-                     , Duckling.Ranking.Classifiers.ZH
+                     , Duckling.Ranking.Classifiers.AR_XX
+                     , Duckling.Ranking.Classifiers.BG_XX
+                     , Duckling.Ranking.Classifiers.CS_XX
+                     , Duckling.Ranking.Classifiers.DA_XX
+                     , Duckling.Ranking.Classifiers.DE_XX
+                     , Duckling.Ranking.Classifiers.EN_CA
+                     , Duckling.Ranking.Classifiers.EN_GB
+                     , Duckling.Ranking.Classifiers.EN_US
+                     , Duckling.Ranking.Classifiers.EN_XX
+                     , Duckling.Ranking.Classifiers.ES_XX
+                     , Duckling.Ranking.Classifiers.ET_XX
+                     , Duckling.Ranking.Classifiers.FR_XX
+                     , Duckling.Ranking.Classifiers.GA_XX
+                     , Duckling.Ranking.Classifiers.HE_XX
+                     , Duckling.Ranking.Classifiers.HR_XX
+                     , Duckling.Ranking.Classifiers.HU_XX
+                     , Duckling.Ranking.Classifiers.ID_XX
+                     , Duckling.Ranking.Classifiers.IT_XX
+                     , Duckling.Ranking.Classifiers.JA_XX
+                     , Duckling.Ranking.Classifiers.KA_XX
+                     , Duckling.Ranking.Classifiers.KO_XX
+                     , Duckling.Ranking.Classifiers.MY_XX
+                     , Duckling.Ranking.Classifiers.NB_XX
+                     , Duckling.Ranking.Classifiers.NL_XX
+                     , Duckling.Ranking.Classifiers.PL_XX
+                     , Duckling.Ranking.Classifiers.PT_XX
+                     , Duckling.Ranking.Classifiers.RO_XX
+                     , Duckling.Ranking.Classifiers.RU_XX
+                     , Duckling.Ranking.Classifiers.SV_XX
+                     , Duckling.Ranking.Classifiers.TR_XX
+                     , Duckling.Ranking.Classifiers.UK_XX
+                     , Duckling.Ranking.Classifiers.VI_XX
+                     , Duckling.Ranking.Classifiers.ZH_CN
+                     , Duckling.Ranking.Classifiers.ZH_HK
+                     , Duckling.Ranking.Classifiers.ZH_MO
+                     , Duckling.Ranking.Classifiers.ZH_TW
+                     , Duckling.Ranking.Classifiers.ZH_XX
 
   -- ------------------------------------------------------------------
   -- Dimensions
@@ -108,6 +121,7 @@
                      , Duckling.Dimensions.Common
                      , Duckling.Dimensions.Types
                      , Duckling.Dimensions.AR
+                     , Duckling.Dimensions.BG
                      , Duckling.Dimensions.CS
                      , Duckling.Dimensions.DA
                      , Duckling.Dimensions.DE
@@ -118,9 +132,11 @@
                      , Duckling.Dimensions.GA
                      , Duckling.Dimensions.HE
                      , Duckling.Dimensions.HR
+                     , Duckling.Dimensions.HU
                      , Duckling.Dimensions.ID
                      , Duckling.Dimensions.IT
                      , Duckling.Dimensions.JA
+                     , Duckling.Dimensions.KA
                      , Duckling.Dimensions.KO
                      , Duckling.Dimensions.MY
                      , Duckling.Dimensions.NB
@@ -138,6 +154,8 @@
                      -- AmountOfMoney
                      , Duckling.AmountOfMoney.EN.Corpus
                      , Duckling.AmountOfMoney.EN.Rules
+                     , Duckling.AmountOfMoney.BG.Corpus
+                     , Duckling.AmountOfMoney.BG.Rules
                      , Duckling.AmountOfMoney.ES.Corpus
                      , Duckling.AmountOfMoney.ES.Rules
                      , Duckling.AmountOfMoney.FR.Corpus
@@ -202,12 +220,16 @@
                      , Duckling.Duration.GA.Rules
                      , Duckling.Duration.HE.Rules
                      , Duckling.Duration.HR.Rules
+                     , Duckling.Duration.HU.Corpus
+                     , Duckling.Duration.HU.Rules
                      , Duckling.Duration.IT.Rules
                      , Duckling.Duration.JA.Corpus
                      , Duckling.Duration.KO.Corpus
                      , Duckling.Duration.KO.Rules
                      , Duckling.Duration.NB.Corpus
                      , Duckling.Duration.NB.Rules
+                     , Duckling.Duration.NL.Corpus
+                     , Duckling.Duration.NL.Rules
                      , Duckling.Duration.PL.Corpus
                      , Duckling.Duration.PL.Rules
                      , Duckling.Duration.PT.Corpus
@@ -236,6 +258,8 @@
                      -- Numeral
                      , Duckling.Numeral.AR.Corpus
                      , Duckling.Numeral.AR.Rules
+                     , Duckling.Numeral.BG.Corpus
+                     , Duckling.Numeral.BG.Rules
                      , Duckling.Numeral.CS.Corpus
                      , Duckling.Numeral.CS.Rules
                      , Duckling.Numeral.DA.Corpus
@@ -256,18 +280,24 @@
                      , Duckling.Numeral.HE.Rules
                      , Duckling.Numeral.HR.Corpus
                      , Duckling.Numeral.HR.Rules
+                     , Duckling.Numeral.HU.Corpus
+                     , Duckling.Numeral.HU.Rules
                      , Duckling.Numeral.ID.Corpus
                      , Duckling.Numeral.ID.Rules
                      , Duckling.Numeral.IT.Corpus
                      , Duckling.Numeral.IT.Rules
                      , Duckling.Numeral.JA.Corpus
                      , Duckling.Numeral.JA.Rules
+                     , Duckling.Numeral.KA.Corpus
+                     , Duckling.Numeral.KA.Rules
                      , Duckling.Numeral.KO.Corpus
                      , Duckling.Numeral.KO.Rules
                      , Duckling.Numeral.MY.Corpus
                      , Duckling.Numeral.MY.Rules
                      , Duckling.Numeral.NB.Corpus
                      , Duckling.Numeral.NB.Rules
+                     , Duckling.Numeral.NL.Corpus
+                     , Duckling.Numeral.NL.Rules
                      , Duckling.Numeral.PL.Corpus
                      , Duckling.Numeral.PL.Rules
                      , Duckling.Numeral.PT.Corpus
@@ -284,8 +314,6 @@
                      , Duckling.Numeral.VI.Rules
                      , Duckling.Numeral.ZH.Corpus
                      , Duckling.Numeral.ZH.Rules
-                     , Duckling.Numeral.NL.Corpus
-                     , Duckling.Numeral.NL.Rules
                      , Duckling.Numeral.RO.Corpus
                      , Duckling.Numeral.RO.Rules
                      , Duckling.Numeral.Helpers
@@ -300,6 +328,7 @@
                      , Duckling.Ordinal.DE.Rules
                      , Duckling.Ordinal.EN.Corpus
                      , Duckling.Ordinal.EN.Rules
+                     , Duckling.Ordinal.ES.Corpus
                      , Duckling.Ordinal.ES.Rules
                      , Duckling.Ordinal.ET.Corpus
                      , Duckling.Ordinal.ET.Rules
@@ -311,6 +340,8 @@
                      , Duckling.Ordinal.HE.Rules
                      , Duckling.Ordinal.HR.Corpus
                      , Duckling.Ordinal.HR.Rules
+                     , Duckling.Ordinal.HU.Corpus
+                     , Duckling.Ordinal.HU.Rules
                      , Duckling.Ordinal.ID.Corpus
                      , Duckling.Ordinal.ID.Rules
                      , Duckling.Ordinal.IT.Corpus
@@ -406,6 +437,12 @@
                      , Duckling.Time.DE.Rules
                      , Duckling.Time.EN.Corpus
                      , Duckling.Time.EN.Rules
+                     , Duckling.Time.EN.CA.Corpus
+                     , Duckling.Time.EN.CA.Rules
+                     , Duckling.Time.EN.GB.Corpus
+                     , Duckling.Time.EN.GB.Rules
+                     , Duckling.Time.EN.US.Corpus
+                     , Duckling.Time.EN.US.Rules
                      , Duckling.Time.ES.Corpus
                      , Duckling.Time.ES.Rules
                      , Duckling.Time.FR.Corpus
@@ -416,6 +453,8 @@
                      , Duckling.Time.HR.Rules
                      , Duckling.Time.HE.Corpus
                      , Duckling.Time.HE.Rules
+                     , Duckling.Time.HU.Corpus
+                     , Duckling.Time.HU.Rules
                      , Duckling.Time.IT.Corpus
                      , Duckling.Time.IT.Rules
                      , Duckling.Time.KO.Corpus
@@ -434,6 +473,14 @@
                      , Duckling.Time.VI.Rules
                      , Duckling.Time.ZH.Corpus
                      , Duckling.Time.ZH.Rules
+                     , Duckling.Time.ZH.CN.Corpus
+                     , Duckling.Time.ZH.CN.Rules
+                     , Duckling.Time.ZH.HK.Corpus
+                     , Duckling.Time.ZH.HK.Rules
+                     , Duckling.Time.ZH.MO.Corpus
+                     , Duckling.Time.ZH.MO.Rules
+                     , Duckling.Time.ZH.TW.Corpus
+                     , Duckling.Time.ZH.TW.Rules
                      , Duckling.Time.Corpus
                      , Duckling.Time.Helpers
                      , Duckling.Time.Types
@@ -449,10 +496,12 @@
                      , Duckling.TimeGrain.GA.Rules
                      , Duckling.TimeGrain.HE.Rules
                      , Duckling.TimeGrain.HR.Rules
+                     , Duckling.TimeGrain.HU.Rules
                      , Duckling.TimeGrain.IT.Rules
                      , Duckling.TimeGrain.JA.Rules
                      , Duckling.TimeGrain.KO.Rules
                      , Duckling.TimeGrain.NB.Rules
+                     , Duckling.TimeGrain.NL.Rules
                      , Duckling.TimeGrain.PL.Rules
                      , Duckling.TimeGrain.PT.Rules
                      , Duckling.TimeGrain.RO.Rules
@@ -538,6 +587,7 @@
 
                      -- AmountOfMoney
                      , Duckling.AmountOfMoney.EN.Tests
+                     , Duckling.AmountOfMoney.BG.Tests
                      , Duckling.AmountOfMoney.ES.Tests
                      , Duckling.AmountOfMoney.FR.Tests
                      , Duckling.AmountOfMoney.GA.Tests
@@ -569,9 +619,11 @@
                      , Duckling.Duration.EN.Tests
                      , Duckling.Duration.FR.Tests
                      , Duckling.Duration.GA.Tests
+                     , Duckling.Duration.HU.Tests
                      , Duckling.Duration.JA.Tests
                      , Duckling.Duration.KO.Tests
                      , Duckling.Duration.NB.Tests
+                     , Duckling.Duration.NL.Tests
                      , Duckling.Duration.PL.Tests
                      , Duckling.Duration.PT.Tests
                      , Duckling.Duration.RO.Tests
@@ -588,6 +640,7 @@
 
                      -- Numeral
                      , Duckling.Numeral.AR.Tests
+                     , Duckling.Numeral.BG.Tests
                      , Duckling.Numeral.CS.Tests
                      , Duckling.Numeral.DA.Tests
                      , Duckling.Numeral.DE.Tests
@@ -598,9 +651,11 @@
                      , Duckling.Numeral.GA.Tests
                      , Duckling.Numeral.HE.Tests
                      , Duckling.Numeral.HR.Tests
+                     , Duckling.Numeral.HU.Tests
                      , Duckling.Numeral.ID.Tests
                      , Duckling.Numeral.IT.Tests
                      , Duckling.Numeral.JA.Tests
+                     , Duckling.Numeral.KA.Tests
                      , Duckling.Numeral.KO.Tests
                      , Duckling.Numeral.MY.Tests
                      , Duckling.Numeral.NB.Tests
@@ -621,11 +676,13 @@
                      , Duckling.Ordinal.DA.Tests
                      , Duckling.Ordinal.DE.Tests
                      , Duckling.Ordinal.EN.Tests
+                     , Duckling.Ordinal.ES.Tests
                      , Duckling.Ordinal.ET.Tests
                      , Duckling.Ordinal.FR.Tests
                      , Duckling.Ordinal.GA.Tests
                      , Duckling.Ordinal.HE.Tests
                      , Duckling.Ordinal.HR.Tests
+                     , Duckling.Ordinal.HU.Tests
                      , Duckling.Ordinal.ID.Tests
                      , Duckling.Ordinal.IT.Tests
                      , Duckling.Ordinal.JA.Tests
@@ -680,6 +737,7 @@
                      , Duckling.Time.GA.Tests
                      , Duckling.Time.HR.Tests
                      , Duckling.Time.HE.Tests
+                     , Duckling.Time.HU.Tests
                      , Duckling.Time.IT.Tests
                      , Duckling.Time.KO.Tests
                      , Duckling.Time.NB.Tests
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
@@ -14,14 +14,15 @@
   , regenClassifiers
   ) where
 
+import Data.HashSet (HashSet)
+import Language.Haskell.Exts as F
+import Prelude
 import qualified Data.HashMap.Strict as HashMap
 import qualified Data.HashSet as HashSet
 import qualified Data.Text as Text
-import Prelude
-import Language.Haskell.Exts as F
 
 import Duckling.Dimensions.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Ranking.Train
 import Duckling.Ranking.Types
 import Duckling.Rules
@@ -29,11 +30,15 @@
 import qualified Duckling.Time.DA.Corpus as DATime
 import qualified Duckling.Time.DE.Corpus as DETime
 import qualified Duckling.Time.EN.Corpus as ENTime
+import qualified Duckling.Time.EN.CA.Corpus as EN_CATime
+import qualified Duckling.Time.EN.GB.Corpus as EN_GBTime
+import qualified Duckling.Time.EN.US.Corpus as EN_USTime
 import qualified Duckling.Time.ES.Corpus as ESTime
 import qualified Duckling.Time.FR.Corpus as FRTime
 import qualified Duckling.Time.GA.Corpus as GATime
 import qualified Duckling.Time.HR.Corpus as HRTime
 import qualified Duckling.Time.HE.Corpus as HETime
+import qualified Duckling.Time.HU.Corpus as HUTime
 import qualified Duckling.Time.IT.Corpus as ITTime
 import qualified Duckling.Time.KO.Corpus as KOTime
 import qualified Duckling.Time.NB.Corpus as NBTime
@@ -43,58 +48,48 @@
 import qualified Duckling.Time.SV.Corpus as SVTime
 import qualified Duckling.Time.VI.Corpus as VITime
 import qualified Duckling.Time.ZH.Corpus as ZHTime
+import qualified Duckling.Time.ZH.CN.Corpus as ZH_CNTime
+import qualified Duckling.Time.ZH.HK.Corpus as ZH_HKTime
+import qualified Duckling.Time.ZH.MO.Corpus as ZH_MOTime
+import qualified Duckling.Time.ZH.TW.Corpus as ZH_TWTime
 
 -- -----------------------------------------------------------------
 -- Main
 
 regenAllClassifiers :: IO ()
-regenAllClassifiers = mapM_ regenClassifiers [minBound .. maxBound]
+regenAllClassifiers = do
+  -- Regen default classifiers for langs
+  mapM_ (regenClassifiers . defaultLocale) [minBound .. maxBound]
+  -- Regen classifiers for locales
+  mapM_ regenClassifiers locales
+  where
+    defaultLocale :: Lang -> Locale
+    defaultLocale lang = Locale lang Nothing
+    f :: [Locale] -> Lang -> HashSet Region -> [Locale]
+    f res lang countries =
+      res ++ [Locale lang (Just c) | c <- HashSet.toList countries]
+    locales = HashMap.foldlWithKey' f [] allLocales
 
 -- | Run this function to overwrite the file with Classifiers data
-regenClassifiers :: Lang -> IO ()
-regenClassifiers lang = do
+regenClassifiers :: Locale -> IO ()
+regenClassifiers locale = do
   putStrLn $ "Regenerating " ++ filepath ++ "..."
   writeFile filepath $
     (headerComment ++) $
     prettyPrintWithMode baseMode $ (noLoc <$) m
   putStrLn "Done!"
   where
-    filepath = "Duckling/Ranking/Classifiers/" ++ show lang ++ ".hs"
+    moduleName = show locale
 
-    rules = rulesFor lang . HashSet.singleton $ This Time
+    filepath = "Duckling/Ranking/Classifiers/" ++ moduleName ++ ".hs"
 
+    rules = rulesFor locale . HashSet.singleton $ This Time
+
     -- | The trained classifier to write out
     classifiers = makeClassifiers rules trainSet
 
     -- | The training set (corpus)
-    trainSet = case lang of
-      AR -> (testContext, [])
-      CS -> (testContext, [])
-      DA -> DATime.corpus
-      DE -> DETime.corpus
-      EN -> ENTime.corpus
-      ES -> ESTime.corpus
-      ET -> (testContext, [])
-      FR -> FRTime.corpus
-      GA -> GATime.corpus
-      HR -> HRTime.corpus
-      HE -> HETime.corpus
-      ID -> (testContext, [])
-      IT -> ITTime.corpus
-      JA -> (testContext, [])
-      KO -> KOTime.corpus
-      MY -> (testContext, [])
-      NB -> NBTime.corpus
-      NL -> (testContext, [])
-      PL -> PLTime.corpus
-      PT -> PTTime.corpus
-      RO -> ROTime.corpus
-      RU -> (testContext, [])
-      SV -> SVTime.corpus
-      TR -> (testContext, [])
-      UK -> (testContext, [])
-      VI -> VITime.corpus
-      ZH -> ZHTime.corpus
+    trainSet = getCorpus locale
 
     -- Data structure for the module
     m = Module () (Just header) pragmas imports decls
@@ -105,7 +100,7 @@
     -- Declares the header for the module
     -- "module Duckling.Ranking.Classifiers (classifiers) where"
     header = ModuleHead ()
-      (ModuleName () $ "Duckling.Ranking.Classifiers." ++ show lang)
+      (ModuleName () $ "Duckling.Ranking.Classifiers." ++ moduleName)
       Nothing $
       Just $ ExportSpecList ()
        [ EVar () (unQual "classifiers")
@@ -113,13 +108,13 @@
 
     -- All imports the file will need
     imports =
-      [ genImportModule "Prelude"
-      , genImportModule "Duckling.Ranking.Types"
+      [ genImportModule "Data.String"
+      , genImportModule "Prelude"
       , (genImportModule "Data.HashMap.Strict")
         { importQualified = True
         , importAs = Just (ModuleName () "HashMap")
         }
-      , genImportModule "Data.String"
+      , genImportModule "Duckling.Ranking.Types"
       ]
 
     -- The code body
@@ -147,6 +142,61 @@
 \-- DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\
 \--  @" ++ "generated\n\
 \-----------------------------------------------------------------\n"
+
+-- | Retrieves the corpus for the locale.
+-- The corpus is all the language examples + all the locale examples, if any.
+-- Locales don't provide a corpus as contexts need to agree.
+getCorpus :: Locale -> Corpus
+getCorpus (Locale lang Nothing) = getDefaultCorpusForLang lang
+getCorpus locale@(Locale lang (Just region)) =
+  withLocale (getCorpusForLang lang) locale $ getExamplesForLocale lang region
+
+-- | For backward compatibility.
+getDefaultCorpusForLang :: Lang -> Corpus
+getDefaultCorpusForLang EN = ENTime.defaultCorpus
+getDefaultCorpusForLang lang = getCorpusForLang lang
+
+getCorpusForLang :: Lang -> Corpus
+getCorpusForLang AR = (testContext, [])
+getCorpusForLang BG = (testContext, [])
+getCorpusForLang CS = (testContext, [])
+getCorpusForLang DA = DATime.corpus
+getCorpusForLang DE = DETime.corpus
+getCorpusForLang EN = ENTime.corpus
+getCorpusForLang ES = ESTime.corpus
+getCorpusForLang ET = (testContext, [])
+getCorpusForLang FR = FRTime.corpus
+getCorpusForLang GA = GATime.corpus
+getCorpusForLang HR = HRTime.corpus
+getCorpusForLang HE = HETime.corpus
+getCorpusForLang HU = HUTime.corpus
+getCorpusForLang ID = (testContext, [])
+getCorpusForLang IT = ITTime.corpus
+getCorpusForLang JA = (testContext, [])
+getCorpusForLang KA = (testContext, [])
+getCorpusForLang KO = KOTime.corpus
+getCorpusForLang MY = (testContext, [])
+getCorpusForLang NB = NBTime.corpus
+getCorpusForLang NL = (testContext, [])
+getCorpusForLang PL = PLTime.corpus
+getCorpusForLang PT = PTTime.corpus
+getCorpusForLang RO = ROTime.corpus
+getCorpusForLang RU = (testContext, [])
+getCorpusForLang SV = SVTime.corpus
+getCorpusForLang TR = (testContext, [])
+getCorpusForLang UK = (testContext, [])
+getCorpusForLang VI = VITime.corpus
+getCorpusForLang ZH = ZHTime.corpus
+
+getExamplesForLocale :: Lang -> Region -> [Example]
+getExamplesForLocale EN CA = EN_CATime.allExamples
+getExamplesForLocale EN GB = EN_GBTime.allExamples
+getExamplesForLocale EN US = EN_USTime.allExamples
+getExamplesForLocale ZH CN = ZH_CNTime.allExamples
+getExamplesForLocale ZH HK = ZH_HKTime.allExamples
+getExamplesForLocale ZH MO = ZH_MOTime.allExamples
+getExamplesForLocale ZH TW = ZH_TWTime.allExamples
+getExamplesForLocale _ _   = []
 
 -- -----------------------------------------------------------------
 -- Source generators
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
@@ -12,11 +12,10 @@
   ( makeClassifiers
   ) where
 
-import qualified Data.HashMap.Strict as HashMap
-import qualified Data.HashSet as HashSet
 import Data.HashSet (HashSet)
-
 import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.HashSet as HashSet
 import qualified Data.List as List
 
 import Duckling.Engine
@@ -63,7 +62,6 @@
     likelihoods = HashMap.map (\x ->
       log $ (fromIntegral x + 1.0) / fromIntegral denum
       ) feats
-
 
 -- | Augment the dataset with one example.
 -- | Add all the nodes contributing to the resolutions of the input sentence.
diff --git a/exe/DucklingExpensive.hs b/exe/DucklingExpensive.hs
--- a/exe/DucklingExpensive.hs
+++ b/exe/DucklingExpensive.hs
@@ -1,16 +1,30 @@
+-- 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 ScopedTypeVariables #-}
 {-# OPTIONS -fno-full-laziness #-}
+
 module Main (main) where
-import Duckling.Debug
+
 import Control.Monad
-import System.Environment
-import Duckling.Lang
 import Data.Some
+import System.Environment
+
+import Duckling.Debug
 import Duckling.Dimensions.Types
+import Duckling.Locale
 
 main :: IO ()
 main = do
   (repeatCount :: Int) <- read . head <$> getArgs
   void $ replicateM repeatCount $ void $ do
-    debug EN "Monday 3rd at 9.30am or 2.30pm, Saturday 8th at 10.30am, Tuesday 11th at 2pm, Wednesday 12th at 2.30pm, Friday 14th at 12.30pm xx" [This Time]
-    debug ES "Horario es de Lunes a Viernes de 2 pm a 10 pm. S\195\161bado de 9 am a 7 pm" [This Time]
+    debug en "Monday 3rd at 9.30am or 2.30pm, Saturday 8th at 10.30am, Tuesday 11th at 2pm, Wednesday 12th at 2.30pm, Friday 14th at 12.30pm xx" [This Time]
+    debug es "Horario es de Lunes a Viernes de 2 pm a 10 pm. S\195\161bado de 9 am a 7 pm" [This Time]
+    where
+      en = makeLocale EN Nothing
+      es = makeLocale ES Nothing
diff --git a/exe/DucklingRequestSample.hs b/exe/DucklingRequestSample.hs
--- a/exe/DucklingRequestSample.hs
+++ b/exe/DucklingRequestSample.hs
@@ -1,22 +1,36 @@
+-- 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 ScopedTypeVariables #-}
 {-# OPTIONS -fno-full-laziness #-}
+
 module Main (main) where
-import Duckling.Debug
+
 import Control.Monad
-import System.Environment
-import Duckling.Lang
 import Data.Some
+import System.Environment
+
+import Duckling.Debug
 import Duckling.Dimensions.Types
+import Duckling.Locale
 
 main :: IO ()
 main = do
   (repeatCount :: Int) <- read . head <$> getArgs
   void $ replicateM repeatCount $ void $ do
-    debug EN "My number is 123" [This PhoneNumber,This Distance,This Numeral,This Email]
-    debug EN "Wednesday 5:00PM 3/29/2017" [This Numeral,This Time]
-    debug ZH "12:30pm" [This Time]
-    debug EN "tomorrow at 4pm" [This Time]
-    debug EN "Tomorrow at 12.30?" [This Time]
-    debug EN "Wednesday 9am" [This Time]
-    debug EN "Sure do! Will 11:30 work?" [This Time,This AmountOfMoney]
-    debug EN "8:00am" [This Time]
+    debug en "My number is 123" [This PhoneNumber,This Distance,This Numeral,This Email]
+    debug en "Wednesday 5:00PM 3/29/2017" [This Numeral,This Time]
+    debug zh "12:30pm" [This Time]
+    debug en "tomorrow at 4pm" [This Time]
+    debug en "Tomorrow at 12.30?" [This Time]
+    debug en "Wednesday 9am" [This Time]
+    debug en "Sure do! Will 11:30 work?" [This Time,This AmountOfMoney]
+    debug en "8:00am" [This Time]
+    where
+      en = makeLocale EN Nothing
+      zh = makeLocale ZH Nothing
diff --git a/exe/ExampleMain.hs b/exe/ExampleMain.hs
--- a/exe/ExampleMain.hs
+++ b/exe/ExampleMain.hs
@@ -16,9 +16,9 @@
 import Data.ByteString (ByteString)
 import Data.HashMap.Strict (HashMap)
 import Data.Maybe
+import Data.String
 import Data.Text (Text)
 import Data.Time.LocalTime.TimeZone.Series
-import Data.String
 import Prelude
 import System.Directory
 import TextShow
@@ -75,6 +75,7 @@
   l <- getPostParam "lang"
   ds <- getPostParam "dims"
   tz <- getPostParam "tz"
+  loc <- getPostParam "locale"
 
   case t of
     Nothing -> do
@@ -86,7 +87,7 @@
       let
         context = Context
           { referenceTime = refTime
-          , lang = parseLang l
+          , locale = maybe (makeLocale (parseLang l) Nothing) parseLocale loc
           }
 
         dimParse = fromMaybe [] $ decode $ LBS.fromStrict $ fromMaybe "" ds
@@ -97,7 +98,17 @@
       writeLBS $ encode parsedResult
   where
     defaultLang = EN
+    defaultLocale = makeLocale defaultLang Nothing
     defaultTimeZone = "America/Los_Angeles"
+
+    parseLocale :: ByteString -> Locale
+    parseLocale x = maybe defaultLocale (`makeLocale` mregion) mlang
+      where
+        (mlang, mregion) = case chunks of
+          [a, b] -> (readMaybe a :: Maybe Lang, readMaybe b :: Maybe Region)
+          _      -> (Nothing, Nothing)
+        chunks = map Text.unpack . Text.split (== '_') . Text.toUpper
+          $ Text.decodeUtf8 x
 
     parseLang :: Maybe ByteString -> Lang
     parseLang l = fromMaybe defaultLang $ l >>=
diff --git a/tests/Duckling/AmountOfMoney/BG/Tests.hs b/tests/Duckling/AmountOfMoney/BG/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/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.AmountOfMoney.BG.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.AmountOfMoney.BG.Corpus
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "BG 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
@@ -13,6 +13,7 @@
 import Test.Tasty
 
 import qualified Duckling.AmountOfMoney.EN.Tests as EN
+import qualified Duckling.AmountOfMoney.BG.Tests as BG
 import qualified Duckling.AmountOfMoney.ES.Tests as ES
 import qualified Duckling.AmountOfMoney.FR.Tests as FR
 import qualified Duckling.AmountOfMoney.GA.Tests as GA
@@ -28,6 +29,7 @@
 tests :: TestTree
 tests = testGroup "AmountOfMoney Tests"
   [ EN.tests
+  , BG.tests
   , ES.tests
   , FR.tests
   , GA.tests
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
@@ -22,7 +22,7 @@
 
 import Duckling.Api
 import Duckling.Dimensions.Types
-import Duckling.Lang
+import Duckling.Locale
 import qualified Duckling.Numeral.Types as TNumeral
 import Duckling.Testing.Asserts
 import Duckling.Testing.Types
diff --git a/tests/Duckling/Duration/HU/Tests.hs b/tests/Duckling/Duration/HU/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Duration/HU/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.HU.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.HU.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "HU Tests"
+  [ makeCorpusTest [This Duration] corpus
+  ]
diff --git a/tests/Duckling/Duration/NL/Tests.hs b/tests/Duckling/Duration/NL/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Duration/NL/Tests.hs
@@ -0,0 +1,25 @@
+-- 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.NL.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.NL.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "NL Tests"
+  [ makeCorpusTest [This Duration] corpus
+  , makeNegativeCorpusTest [This Duration] negativeCorpus
+  ]
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
@@ -17,9 +17,11 @@
 import qualified Duckling.Duration.EN.Tests as EN
 import qualified Duckling.Duration.FR.Tests as FR
 import qualified Duckling.Duration.GA.Tests as GA
+import qualified Duckling.Duration.HU.Tests as HU
 import qualified Duckling.Duration.JA.Tests as JA
 import qualified Duckling.Duration.KO.Tests as KO
 import qualified Duckling.Duration.NB.Tests as NB
+import qualified Duckling.Duration.NL.Tests as NL
 import qualified Duckling.Duration.PL.Tests as PL
 import qualified Duckling.Duration.PT.Tests as PT
 import qualified Duckling.Duration.RO.Tests as RO
@@ -32,9 +34,11 @@
   [ EN.tests
   , FR.tests
   , GA.tests
+  , HU.tests
   , JA.tests
   , KO.tests
   , NB.tests
+  , NL.tests
   , PL.tests
   , PT.tests
   , RO.tests
diff --git a/tests/Duckling/Duration/ZH/Tests.hs b/tests/Duckling/Duration/ZH/Tests.hs
--- a/tests/Duckling/Duration/ZH/Tests.hs
+++ b/tests/Duckling/Duration/ZH/Tests.hs
@@ -10,22 +10,16 @@
   ( tests
   ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
-import Test.Tasty.HUnit
 
 import Duckling.Dimensions.Types
 import Duckling.Duration.ZH.Corpus
-import Duckling.Lang
-import Duckling.Resolve
 import Duckling.Testing.Asserts
+import Duckling.Testing.Types
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ testCase "Corpus Tests" $
-      mapM_ (analyzedFirstTest context {lang = ZH} . withTargets [This Duration])
-        xs
+  [ makeCorpusTest [This Duration] corpus
   ]
-  where
-    (context, xs) = corpus
diff --git a/tests/Duckling/Email/EN/Tests.hs b/tests/Duckling/Email/EN/Tests.hs
--- a/tests/Duckling/Email/EN/Tests.hs
+++ b/tests/Duckling/Email/EN/Tests.hs
@@ -20,4 +20,5 @@
 tests :: TestTree
 tests = testGroup "Email Tests"
   [ makeCorpusTest [This Email] corpus
+  , makeNegativeCorpusTest [This Email] negativeCorpus
   ]
diff --git a/tests/Duckling/Numeral/BG/Tests.hs b/tests/Duckling/Numeral/BG/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/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.Numeral.BG.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.BG.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "BG Tests"
+  [ makeCorpusTest [This Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/HU/Tests.hs b/tests/Duckling/Numeral/HU/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/HU/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.HU.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.HU.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "HU Tests"
+  [ makeCorpusTest [This Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/KA/Tests.hs b/tests/Duckling/Numeral/KA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/KA/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.KA.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.KA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "KA 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
@@ -13,6 +13,7 @@
 import Test.Tasty
 
 import qualified Duckling.Numeral.AR.Tests as AR
+import qualified Duckling.Numeral.BG.Tests as BG
 import qualified Duckling.Numeral.CS.Tests as CS
 import qualified Duckling.Numeral.DA.Tests as DA
 import qualified Duckling.Numeral.DE.Tests as DE
@@ -23,9 +24,11 @@
 import qualified Duckling.Numeral.GA.Tests as GA
 import qualified Duckling.Numeral.HE.Tests as HE
 import qualified Duckling.Numeral.HR.Tests as HR
+import qualified Duckling.Numeral.HU.Tests as HU
 import qualified Duckling.Numeral.ID.Tests as ID
 import qualified Duckling.Numeral.IT.Tests as IT
 import qualified Duckling.Numeral.JA.Tests as JA
+import qualified Duckling.Numeral.KA.Tests as KA
 import qualified Duckling.Numeral.KO.Tests as KO
 import qualified Duckling.Numeral.MY.Tests as MY
 import qualified Duckling.Numeral.NB.Tests as NB
@@ -43,6 +46,7 @@
 tests :: TestTree
 tests = testGroup "Numeral Tests"
   [ AR.tests
+  , BG.tests
   , CS.tests
   , DA.tests
   , DE.tests
@@ -53,9 +57,11 @@
   , GA.tests
   , HE.tests
   , HR.tests
+  , HU.tests
   , ID.tests
   , IT.tests
   , JA.tests
+  , KA.tests
   , KO.tests
   , MY.tests
   , NB.tests
diff --git a/tests/Duckling/Ordinal/ES/Tests.hs b/tests/Duckling/Ordinal/ES/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/ES/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.ES.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.ES.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "ES Tests"
+  [ makeCorpusTest [This Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/HU/Tests.hs b/tests/Duckling/Ordinal/HU/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/HU/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.Ordinal.HU.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.HU.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "HU 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
@@ -16,11 +16,13 @@
 import qualified Duckling.Ordinal.DA.Tests as DA
 import qualified Duckling.Ordinal.DE.Tests as DE
 import qualified Duckling.Ordinal.EN.Tests as EN
+import qualified Duckling.Ordinal.ES.Tests as ES
 import qualified Duckling.Ordinal.ET.Tests as ET
 import qualified Duckling.Ordinal.FR.Tests as FR
 import qualified Duckling.Ordinal.GA.Tests as GA
 import qualified Duckling.Ordinal.HE.Tests as HE
 import qualified Duckling.Ordinal.HR.Tests as HR
+import qualified Duckling.Ordinal.HU.Tests as HU
 import qualified Duckling.Ordinal.ID.Tests as ID
 import qualified Duckling.Ordinal.IT.Tests as IT
 import qualified Duckling.Ordinal.JA.Tests as JA
@@ -43,11 +45,13 @@
   , DA.tests
   , DE.tests
   , EN.tests
+  , ES.tests
   , ET.tests
   , FR.tests
   , GA.tests
   , HE.tests
   , HR.tests
+  , HU.tests
   , ID.tests
   , IT.tests
   , JA.tests
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
@@ -18,16 +18,17 @@
   , withTargets
   ) where
 
-import qualified Data.HashSet as HashSet
 import Data.String
 import Data.Text (Text)
-import qualified Data.Text as Text
 import Prelude
 import Test.Tasty
 import Test.Tasty.HUnit
+import qualified Data.HashSet as HashSet
+import qualified Data.Text as Text
 
 import Duckling.Api
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Types
 import Duckling.Types
diff --git a/tests/Duckling/Time/DA/Tests.hs b/tests/Duckling/Time/DA/Tests.hs
--- a/tests/Duckling/Time/DA/Tests.hs
+++ b/tests/Duckling/Time/DA/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.DA.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
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
@@ -22,21 +22,46 @@
 import Test.Tasty.HUnit
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Asserts
 import Duckling.Testing.Types hiding (examples)
 import Duckling.Time.Corpus
 import Duckling.Time.EN.Corpus
 import Duckling.TimeGrain.Types (Grain(..))
+import qualified Duckling.Time.EN.CA.Corpus as CA
+import qualified Duckling.Time.EN.GB.Corpus as GB
+import qualified Duckling.Time.EN.US.Corpus as US
 
 tests :: TestTree
 tests = testGroup "EN Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [This Time] defaultCorpus
   , makeNegativeCorpusTest [This Time] negativeCorpus
   , exactSecondTests
   , valuesTest
   , intersectTests
+  , localeTests
   ]
+
+localeTests :: TestTree
+localeTests = testGroup "Locale Tests"
+  [ testGroup "EN_CA Tests"
+    [ makeCorpusTest [This Time] $ withLocale corpus localeCA CA.allExamples
+    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeCA []
+    ]
+  , testGroup "EN_GB Tests"
+    [ makeCorpusTest [This Time] $ withLocale corpus localeGB GB.allExamples
+    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeGB []
+    ]
+  , testGroup "EN_US Tests"
+    [ makeCorpusTest [This Time] $ withLocale corpus localeUS US.allExamples
+    , makeNegativeCorpusTest [This Time] $ withLocale negativeCorpus localeUS []
+    ]
+  ]
+  where
+    localeCA = makeLocale EN $ Just CA
+    localeGB = makeLocale EN $ Just GB
+    localeUS = makeLocale EN $ Just US
 
 exactSecondTests :: TestTree
 exactSecondTests = testCase "Exact Second Tests" $
diff --git a/tests/Duckling/Time/ES/Tests.hs b/tests/Duckling/Time/ES/Tests.hs
--- a/tests/Duckling/Time/ES/Tests.hs
+++ b/tests/Duckling/Time/ES/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.ES.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Time/FR/Tests.hs b/tests/Duckling/Time/FR/Tests.hs
--- a/tests/Duckling/Time/FR/Tests.hs
+++ b/tests/Duckling/Time/FR/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.FR.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
@@ -20,4 +20,5 @@
 tests :: TestTree
 tests = testGroup "FR Tests"
   [ makeCorpusTest [This Time] corpus
+  , makeNegativeCorpusTest [This Time] negativeCorpus
   ]
diff --git a/tests/Duckling/Time/GA/Tests.hs b/tests/Duckling/Time/GA/Tests.hs
--- a/tests/Duckling/Time/GA/Tests.hs
+++ b/tests/Duckling/Time/GA/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.GA.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Time/HU/Tests.hs b/tests/Duckling/Time/HU/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Time/HU/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.Time.HU.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+import Duckling.Time.HU.Corpus
+
+tests :: TestTree
+tests = testGroup "HU Tests"
+  [ makeCorpusTest [This Time] corpus
+  ]
diff --git a/tests/Duckling/Time/IT/Tests.hs b/tests/Duckling/Time/IT/Tests.hs
--- a/tests/Duckling/Time/IT/Tests.hs
+++ b/tests/Duckling/Time/IT/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.IT.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Time/KO/Tests.hs b/tests/Duckling/Time/KO/Tests.hs
--- a/tests/Duckling/Time/KO/Tests.hs
+++ b/tests/Duckling/Time/KO/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.KO.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Time/NB/Tests.hs b/tests/Duckling/Time/NB/Tests.hs
--- a/tests/Duckling/Time/NB/Tests.hs
+++ b/tests/Duckling/Time/NB/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.NB.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Time/PL/Tests.hs b/tests/Duckling/Time/PL/Tests.hs
--- a/tests/Duckling/Time/PL/Tests.hs
+++ b/tests/Duckling/Time/PL/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.PL.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
@@ -20,4 +20,5 @@
 tests :: TestTree
 tests = testGroup "PL Tests"
   [ makeCorpusTest [This Time] corpus
+  , makeNegativeCorpusTest [This Time] negativeCorpus
   ]
diff --git a/tests/Duckling/Time/PT/Tests.hs b/tests/Duckling/Time/PT/Tests.hs
--- a/tests/Duckling/Time/PT/Tests.hs
+++ b/tests/Duckling/Time/PT/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.PT.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Time/RO/Tests.hs b/tests/Duckling/Time/RO/Tests.hs
--- a/tests/Duckling/Time/RO/Tests.hs
+++ b/tests/Duckling/Time/RO/Tests.hs
@@ -9,8 +9,8 @@
 module Duckling.Time.RO.Tests
   ( tests ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
@@ -20,4 +20,5 @@
 tests :: TestTree
 tests = testGroup "RO Tests"
   [ makeCorpusTest [This Time] corpus
+  , makeNegativeCorpusTest [This Time] negativeCorpus
   ]
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
@@ -12,15 +12,15 @@
 module Duckling.Time.SV.Tests
   ( tests ) where
 
-import qualified Data.HashSet as HashSet
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 import Test.Tasty.HUnit
+import qualified Data.HashSet as HashSet
 
 import Duckling.Api
 import Duckling.Dimensions.Types
-import Duckling.Lang
+import Duckling.Locale
 import Duckling.Resolve
 import Duckling.Testing.Asserts
 import Duckling.Testing.Types hiding (examples)
@@ -43,7 +43,7 @@
     xs = examples (datetimeInterval ((2013, 2, 12, 4, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
                   [ "i morgonen"
                   ]
-    ctx = testContext {lang = SV}
+    ctx = testContext {locale = makeLocale SV Nothing}
     dims = HashSet.singleton $ This Time
     check :: Example -> IO ()
     check (input, predicate) = case analyze input ctx dims of
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
@@ -32,6 +32,7 @@
 import qualified Duckling.Time.GA.Tests as GA
 import qualified Duckling.Time.HR.Tests as HR
 import qualified Duckling.Time.HE.Tests as HE
+import qualified Duckling.Time.HU.Tests as HU
 import qualified Duckling.Time.IT.Tests as IT
 import qualified Duckling.Time.KO.Tests as KO
 import qualified Duckling.Time.NB.Tests as NB
@@ -52,6 +53,7 @@
   , GA.tests
   , HR.tests
   , HE.tests
+  , HU.tests
   , IT.tests
   , KO.tests
   , NB.tests
diff --git a/tests/Duckling/Time/VI/Tests.hs b/tests/Duckling/Time/VI/Tests.hs
--- a/tests/Duckling/Time/VI/Tests.hs
+++ b/tests/Duckling/Time/VI/Tests.hs
@@ -8,8 +8,8 @@
 module Duckling.Time.VI.Tests
   ( tests ) where
 
-import Data.String
 import Prelude
+import Data.String
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Time/ZH/Tests.hs b/tests/Duckling/Time/ZH/Tests.hs
--- a/tests/Duckling/Time/ZH/Tests.hs
+++ b/tests/Duckling/Time/ZH/Tests.hs
@@ -7,17 +7,46 @@
 
 
 module Duckling.Time.ZH.Tests
-  ( tests ) where
+  ( tests
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
 import Duckling.Testing.Asserts
+import Duckling.Testing.Types
 import Duckling.Time.ZH.Corpus
+import qualified Duckling.Time.ZH.CN.Corpus as CN
+import qualified Duckling.Time.ZH.HK.Corpus as HK
+import qualified Duckling.Time.ZH.MO.Corpus as MO
+import qualified Duckling.Time.ZH.TW.Corpus as TW
 
 tests :: TestTree
 tests = testGroup "ZH Tests"
-  [ makeCorpusTest [This Time] corpus
+  [ makeCorpusTest [This Time] defaultCorpus
+  , localeTests
   ]
+
+localeTests :: TestTree
+localeTests = testGroup "Locale Tests"
+  [ testGroup "ZH_CN Tests"
+    [ makeCorpusTest [This Time] $ withLocale corpus localeCN CN.allExamples
+    ]
+  , testGroup "ZH_HK Tests"
+    [ makeCorpusTest [This Time] $ withLocale corpus localeHK HK.allExamples
+    ]
+  , testGroup "ZH_MO Tests"
+    [ makeCorpusTest [This Time] $ withLocale corpus localeMO MO.allExamples
+    ]
+  , testGroup "ZH_TW Tests"
+    [ makeCorpusTest [This Time] $ withLocale corpus localeTW TW.allExamples
+    ]
+  ]
+  where
+    localeCN = makeLocale ZH $ Just CN
+    localeHK = makeLocale ZH $ Just HK
+    localeMO = makeLocale ZH $ Just MO
+    localeTW = makeLocale ZH $ Just TW
